David Fletcher
/
cc3100_Test_Demo
TI's CC3100. A test demo with very little testing done!
Revision 5:d3b320ebd469, committed 2015-03-19
- Comitter:
- dflet
- Date:
- Thu Mar 19 14:35:32 2015 +0000
- Parent:
- 4:5af740da0a59
- Child:
- 6:778b081f6a13
- Commit message:
- Updated to CC3100SDK1.1.0
Changed in this revision
--- a/G_functions/fPtr_func.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,755 +0,0 @@ -/* - * - 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 "cc3100_simplelink.h" - -#include "cc3100.h" -#include "fPtr_func.h" - - -using namespace mbed_cc3100; - -cc3100_driver *_driver; -cc3100_nonos *_nonos; -cc3100_netapp *_netapp; -cc3100 *_cc3100_; - -#ifdef __cplusplus -extern "C" { -#endif - -/*! - \brief This function handles ping report events - - \param[in] pPingReport holds the ping report statistics - - \return None - - \note - - \warning -*/ -void SimpleLinkPingReport(SlPingReport_t *pPingReport) -{ - _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE); - - if(pPingReport == NULL) - printf(" [PING REPORT] NULL Pointer Error\r\n"); - - g_PingPacketsRecv = pPingReport->PacketsReceived; -} - - -/*******************************************************************************/ -/* _sl_HandleAsync_Accept */ -/*******************************************************************************/ -void _sl_HandleAsync_Accept(void *pVoidBuf) -{ - _SocketAddrResponse_u *pMsgArgs = (_SocketAddrResponse_u *)_SL_RESP_ARGS_START(pVoidBuf); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_PROTOCOL(( pMsgArgs->IpV4.sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS); - VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); - - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,sizeof(_SocketAddrResponse_u)); - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return; -} - -/*******************************************************************************/ -/* _sl_HandleAsync_Connect */ -/*******************************************************************************/ -void _sl_HandleAsync_Connect(void *pVoidBuf) -{ - _SocketResponse_t *pMsgArgs = (_SocketResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_PROTOCOL((pMsgArgs->sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS); - VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); - - ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->sd = pMsgArgs->sd; - ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->statusOrLen = pMsgArgs->statusOrLen; - - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return; -} - -/*******************************************************************************/ -/* _sl_HandleAsync_Select */ -/*******************************************************************************/ -void _sl_HandleAsync_Select(void *pVoidBuf) -{ - _SelectAsyncResponse_t *pMsgArgs = (_SelectAsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); - - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_SelectAsyncResponse_t)); - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return; -} - -/******************************************************************************/ -/* _sl_HandleAsync_DnsGetHostByName */ -/******************************************************************************/ -void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf) -{ - _GetHostByNameIPv4AsyncResponse_t *pMsgArgs = (_GetHostByNameIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); - - /*IPv6 */ - if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) { - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv6AsyncResponse_t)); - } - /*IPv4 */ - else { - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv4AsyncResponse_t)); - } - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return; -} - -/******************************************************************************/ - -/****************************************************************************** - _sl_HandleAsync_DnsGetHostByService - - CALLER NWP - Async event on sl_DnsGetHostByService with IPv4 Family - - - DESCRIPTION: - - Async event on sl_DnsGetHostByService command with IPv4 Family. - Return service attributes like IP address, port and text according to service name. - The user sets a service name Full/Part (see example below), and should get the: - 1. IP of the service - 2. The port of service. - 3. The text of service. - - Hence it can make a connection to the specific service and use it. - It is similar to get host by name method. - - It is done by a single shot query with PTR type on the service name. - - - - Note: - 1. The return's attributes are belonged to first service that is found. - It can be other services with the same service name will response to - the query. The results of these responses are saved in the peer cache of the NWP, and - should be read by another API. - - - PARAMETERS: - - pVoidBuf - is point to opcode of the event. - it contains the outputs that are given to the user - - outputs description: - - 1.out_pAddr[] - output: Contain the IP address of the service. - 2.out_pPort - output: Contain the port of the service. - 3.inout_TextLen - Input: Contain the max length of the text that the user wants to get. - it means that if the test of service is bigger that its value than - the text is cut to inout_TextLen value. - Output: Contain the length of the text that is returned. Can be full text or part - of the text (see above). - - 4.out_pText - Contain the text of the service (full or part see above- inout_TextLen description). - - * - - - RETURNS: success or fail. - -******************************************************************************/ -void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf) -{ - _GetHostByServiceAsyncResponse_t* Res; - uint16_t TextLen; - uint16_t UserTextLen; - - /*pVoidBuf - is point to opcode of the event.*/ - - /*set pMsgArgs to point to the attribute of the event.*/ - _GetHostByServiceIPv4AsyncResponse_t *pMsgArgs = (_GetHostByServiceIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - - VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); - - /*IPv6*/ - if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) { - return; - } - /*IPv4*/ - else { - /************************************************************************************************* - - 1. Copy the attribute part of the evnt to the attribute part of the response - memcpy(g_pCB->GetHostByServiceCB.pAsyncRsp, pMsgArgs, sizeof(_GetHostByServiceIPv4AsyncResponse_t)); - - set to TextLen the text length of the service.*/ - TextLen = pMsgArgs->TextLen; - - /*Res pointed to mDNS global object struct */ - Res = (_GetHostByServiceAsyncResponse_t*)g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs; - - - - /*It is 4 bytes so we avoid from memcpy*/ - Res->out_pAddr[0] = pMsgArgs->Address; - Res->out_pPort[0] = pMsgArgs->Port; - Res->Status = pMsgArgs->Status; - - /*set to TextLen the text length of the user (input fromthe user).*/ - UserTextLen = Res->inout_TextLen[0]; - - /*Cut the service text if the user requested for smaller text.*/ - UserTextLen = (TextLen <= UserTextLen) ? TextLen : UserTextLen; - Res->inout_TextLen[0] = UserTextLen ; - - /************************************************************************************************** - - 2. Copy the payload part of the evnt (the text) to the payload part of the response - the lenght of the copy is according to the text length in the attribute part. */ - - - memcpy(Res->out_pText , - (int8_t *)(& pMsgArgs[1]), /* & pMsgArgs[1] -> 1st byte after the fixed header = 1st byte of variable text.*/ - UserTextLen); - - - /**************************************************************************************************/ - - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - return; - } -} - -/*****************************************************************************/ -/* _sl_HandleAsync_PingResponse */ -/*****************************************************************************/ -void _sl_HandleAsync_PingResponse(void *pVoidBuf) -{ - _PingReportResponse_t *pMsgArgs = (_PingReportResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - SlPingReport_t pingReport; - - if(pPingCallBackFunc) { - _netapp->CopyPingResultsToReport(pMsgArgs,&pingReport); - pPingCallBackFunc(&pingReport); - } else { - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE,NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - VERIFY_SOCKET_CB(NULL != g_pCB->PingCB.PingAsync.pAsyncRsp); - - if (NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs) { - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_PingReportResponse_t)); - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - } - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - } - return; -} - -/* ******************************************************************************/ -/* _SlDrvMsgReadSpawnCtx */ -/* ******************************************************************************/ -_SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue) -{ - -#ifdef SL_POLLING_MODE_USED - int16_t retCode = OSI_OK; - /* for polling based systems */ - do { - retCode = sl_LockObjLock(&g_pCB->GlobalLockObj, 0); - if ( OSI_OK != retCode ) { - if (TRUE == g_pCB->IsCmdRespWaited) { - OSI_RET_OK_CHECK( sl_SyncObjSignal(&g_pCB->CmdSyncObj) ); - return SL_RET_CODE_OK; - } - } - - } while (OSI_OK != retCode); - -#else - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER) ); - -#endif - - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;/* buffer must be allocated by _SlDrvMsgRead */ - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL; - g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS;/* init to illegal value and verify it's overwritten with the valid one */ - - /* Messages might have been read by CmdResp context. Therefore after */ - /* getting LockObj, check again where the Pending Rx Msg is still present. */ - if(FALSE == (_driver->_SL_PENDING_RX_MSG(g_pCB))) { - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return SL_RET_CODE_OK; - } - - VERIFY_RET_OK(_driver->_SlDrvMsgRead()); - - g_pCB->RxDoneCnt++; - - switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) { - case ASYNC_EVT_CLASS: - /* If got here and protected by LockObj a message is waiting */ - /* to be read */ - VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - - _driver->_SlAsyncEventGenericHandler(); - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL; -#else - free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); -#endif - break; - case DUMMY_MSG_CLASS: - case RECV_RESP_CLASS: - /* These types are legal in this context. Do nothing */ - break; - case CMD_RESP_CLASS: - /* Command response is illegal in this context. */ - /* No 'break' here: Assert! */ - default: - VERIFY_PROTOCOL(0); - } - - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - return(SL_RET_CODE_OK); - -} - -/*************************************************************************** -_sl_HandleAsync_Stop - handles stop signalling to -a waiting object -****************************************************************************/ -void _sl_HandleAsync_Stop(void *pVoidBuf) -{ - _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); - - VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp); - - OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE,NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_BasicResponse_t)); - OSI_RET_OK_CHECK(_nonos->sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return; -} - -/****************************************************************************** -_SlDrvDeviceEventHandler - handles internally device async events -******************************************************************************/ -void _SlDrvDeviceEventHandler(void *pArgs) -{ - _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs; - - switch(pHdr->GenHeader.Opcode) { - case SL_OPCODE_DEVICE_INITCOMPLETE: - _cc3100_->_sl_HandleAsync_InitComplete(pHdr); - - break; - case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE: - _sl_HandleAsync_Stop(pHdr); - - break; - case SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR: -#ifdef sl_GeneralEvtHdlr - { - _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pHdr); - SlDeviceEvent_t devHandler; - devHandler.Event = SL_DEVICE_FATAL_ERROR_EVENT; - devHandler.EventData.deviceEvent.status = pMsgArgs->status & 0xFF; - devHandler.EventData.deviceEvent.sender = (SlErrorSender_e)((pMsgArgs->status >> 8) & 0xFF); - SimpleLinkGeneralEventHandler(&devHandler); - } -#endif - break; - default: - //SL_ERROR_TRACE2(MSG_306, "ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); - printf("ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); - VERIFY_PROTOCOL(0); - } -} - -/*****************************************************************************/ -/* _SlDrvNetAppEventHandler */ -/*****************************************************************************/ -void _SlDrvNetAppEventHandler(void *pArgs) -{ - _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs; -#ifdef sl_HttpServerCallback - SlHttpServerEvent_t httpServerEvent; - SlHttpServerResponse_t httpServerResponse; -#endif - switch(pHdr->GenHeader.Opcode) { - case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE: - case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE_V6: - _sl_HandleAsync_DnsGetHostByName(pArgs); - break; - case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE: - case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE_V6: - _sl_HandleAsync_DnsGetHostByService(pArgs); - break; - case SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE: - _sl_HandleAsync_PingResponse(pArgs); - break; - case SL_OPCODE_NETAPP_HTTPGETTOKENVALUE: { -#ifdef sl_HttpServerCallback - uint8_t *pTokenName; - slHttpServerData_t Token_value; - sl_NetAppHttpServerGetToken_t *httpGetToken = (sl_NetAppHttpServerGetToken_t *)_SL_RESP_ARGS_START(pHdr); - pTokenName = (uint8_t *)((sl_NetAppHttpServerGetToken_t *)httpGetToken + 1); - - httpServerResponse.Response = SL_NETAPP_HTTPSETTOKENVALUE; - httpServerResponse.ResponseData.token_value.len = MAX_TOKEN_VALUE_LEN; - httpServerResponse.ResponseData.token_value.data = (uint8_t *)_SL_RESP_ARGS_START(pHdr) + MAX_TOKEN_NAME_LEN; //Reuse the async buffer for getting the token value response from the user - - httpServerEvent.Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT; - httpServerEvent.EventData.httpTokenName.len = httpGetToken->token_name_len; - httpServerEvent.EventData.httpTokenName.data = pTokenName; - - Token_value.token_name = pTokenName; - - SimpleLinkHttpServerCallback(&httpServerEvent, &httpServerResponse); - - Token_value.value_len = httpServerResponse.ResponseData.token_value.len; - Token_value.name_len = httpServerEvent.EventData.httpTokenName.len; - - Token_value.token_value = httpServerResponse.ResponseData.token_value.data; - - - _netapp->sl_NetAppSendTokenValue(&Token_value); -#endif - } - break; - - case SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE: { -#ifdef sl_HttpServerCallback - uint8_t *pPostParams; - - sl_NetAppHttpServerPostToken_t *httpPostTokenArgs = (sl_NetAppHttpServerPostToken_t *)_SL_RESP_ARGS_START(pHdr); - pPostParams = (uint8_t *)((sl_NetAppHttpServerPostToken_t *)httpPostTokenArgs + 1); - - httpServerEvent.Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT; - - httpServerEvent.EventData.httpPostData.action.len = httpPostTokenArgs->post_action_len; - httpServerEvent.EventData.httpPostData.action.data = pPostParams; - pPostParams+=httpPostTokenArgs->post_action_len; - - httpServerEvent.EventData.httpPostData.token_name.len = httpPostTokenArgs->token_name_len; - httpServerEvent.EventData.httpPostData.token_name.data = pPostParams; - pPostParams+=httpPostTokenArgs->token_name_len; - - httpServerEvent.EventData.httpPostData.token_value.len = httpPostTokenArgs->token_value_len; - httpServerEvent.EventData.httpPostData.token_value.data = pPostParams; - - httpServerResponse.Response = SL_NETAPP_RESPONSE_NONE; - - - SimpleLinkHttpServerCallback(&httpServerEvent, &httpServerResponse); -#endif - } - break; - default: - SL_ERROR_TRACE2(MSG_305, "ASSERT: _SlDrvNetAppEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); - VERIFY_PROTOCOL(0); - } -} - -/* - * ASYNCHRONOUS EVENT HANDLERS -- Start - */ - -/*! - \brief This function handles WLAN events - - \param[in] pWlanEvent is the event passed to the handler - - \return None - - \note - - \warning -*/ -#if (defined(sl_WlanEvtHdlr)) -void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) -{ - unsigned char g_ucConnectionSSID[32+1]; //Connection SSID - unsigned char g_ucConnectionBSSID[6]; //Connection BSSID - - if(pWlanEvent == NULL) - printf(" [WLAN EVENT] NULL Pointer Error \n\r"); - - switch(pWlanEvent->Event) { - case SL_WLAN_CONNECT_EVENT: { - _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION); - - // Copy new connection SSID and BSSID to global parameters - memcpy(g_ucConnectionSSID,pWlanEvent->EventData. - STAandP2PModeWlanConnected.ssid_name, - pWlanEvent->EventData.STAandP2PModeWlanConnected.ssid_len); - memcpy(g_ucConnectionBSSID, - pWlanEvent->EventData.STAandP2PModeWlanConnected.bssid, - SL_BSSID_LENGTH); - - printf("[WLAN EVENT] STA Connected to the AP: %s ," - "BSSID: %x:%x:%x:%x:%x:%x\n\r", - g_ucConnectionSSID,g_ucConnectionBSSID[0], - g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], - g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], - g_ucConnectionBSSID[5]); - /* - * Information about the connected AP (like name, MAC etc) will be - * available in 'slWlanConnectAsyncResponse_t' - Applications - * can use it if required - * - * slWlanConnectAsyncResponse_t *pEventData = NULL; - * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected; - * - */ - } - break; - - case SL_WLAN_DISCONNECT_EVENT: { - slWlanConnectAsyncResponse_t* pEventData = NULL; - - _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION); - _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED); - - pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected; - - /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */ - if(SL_USER_INITIATED_DISCONNECTION == pEventData->reason_code) { - printf("[WLAN EVENT]Device disconnected from the AP: %s," - "BSSID: %x:%x:%x:%x:%x:%x on application's request \n\r", - g_ucConnectionSSID,g_ucConnectionBSSID[0], - g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], - g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], - g_ucConnectionBSSID[5]); - } else { - printf("[WLAN ERROR]Device disconnected from the AP AP: %s," - "BSSID: %x:%x:%x:%x:%x:%x on an ERROR..!! \n\r", - g_ucConnectionSSID,g_ucConnectionBSSID[0], - g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], - g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], - g_ucConnectionBSSID[5]); - } - memset(g_ucConnectionSSID,0,sizeof(g_ucConnectionSSID)); - memset(g_ucConnectionBSSID,0,sizeof(g_ucConnectionBSSID)); - } - break; - - case SL_WLAN_STA_CONNECTED_EVENT: { - _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED); - } - break; - - case SL_WLAN_STA_DISCONNECTED_EVENT: { - _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED); - _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED); - } - break; - - default: { - printf("[WLAN EVENT] Unexpected event [0x%x]\n\r",pWlanEvent->Event); - } - break; - } -} -#endif - -/*! - \brief This function handles events for IP address acquisition via DHCP - indication - - \param[in] pNetAppEvent is the event passed to the handler - - \return None - - \note - - \warning -*/ -#if (defined(sl_NetAppEvtHdlr)) -void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) -{ - - if(pNetAppEvent == NULL){ - printf(" [NETAPP EVENT] NULL Pointer Error \n\r"); - } - - switch(pNetAppEvent->Event) { - case SL_NETAPP_IPV4_IPACQUIRED_EVENT: { - SlIpV4AcquiredAsync_t *pEventData = NULL; - _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED); - pEventData = &pNetAppEvent->EventData.ipAcquiredV4; - g_GatewayIP = pEventData->gateway; - - printf("[NETAPP EVENT] IP Acquired: IP=%d.%d.%d.%d , ""Gateway=%d.%d.%d.%d\n\r", - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,3), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,2), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,1), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,0), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,3), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,2), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,1), - _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,0)); - - } - break; - - case SL_NETAPP_IP_LEASED_EVENT: { - g_StationIP = pNetAppEvent->EventData.ipLeased.ip_address; - _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED); - - } - break; - - default: { - printf("[NETAPP EVENT] Unexpected event [0x%x] \n\r",pNetAppEvent->Event); - } - break; - } -} -#endif - -/*! - \brief This function handles socket events indication - - \param[in] pSock is the event passed to the handler - - \return None -*/ -#if (defined(sl_SockEvtHdlr)) -void SimpleLinkSockEventHandler(SlSockEvent_t *pSock) -{ - if(pSock == NULL) - printf(" [SOCK EVENT] NULL Pointer Error \n\r"); - - switch( pSock->Event ) - { - case SL_SOCKET_TX_FAILED_EVENT: - /* - * TX Failed - * - * Information about the socket descriptor and status will be - * available in 'SlSockEventData_t' - Applications can use it if - * required - * - * SlSockEventData_t *pEventData = NULL; - * pEventData = & pSock->EventData; - */ - switch( pSock->EventData.status ) - { - case SL_ECLOSE: - printf(" [SOCK EVENT] Close socket operation, failed to transmit all queued packets\n\r"); - break; - default: - printf("[SOCK ERROR] - TX FAILED : socket %d , reason""(%d) \n\n", pSock->EventData.sd, pSock->EventData.status); - break; - } - break; - - default: - printf("[SOCK EVENT] - Unexpected Event [%x0x]\n\n",pSock->Event); - break; - } -} -#endif - -/*! - \brief This function handles callback for the HTTP server events - - \param[in] pHttpEvent - Contains the relevant event information - \param[in] pHttpResponse - Should be filled by the user with the - relevant response information - - \return None - - \note - - \warning -*/ -#if (defined(sl_HttpServerCallback)) -void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent, SlHttpServerResponse_t *pHttpResponse) -{ - /* - * This application doesn't work with HTTP server - Hence these - * events are not handled here - */ - printf(" [HTTP EVENT] Unexpected event \n\r"); -} -#endif -/*! - \brief This function handles general error events indication - - \param[in] pDevEvent is the event passed to the handler - - \return None -*/ -#if (defined(sl_GeneralEvtHdlr)) -void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent) -{ - /* - * Most of the general errors are not FATAL are are to be handled - * appropriately by the application - */ - printf("[GENERAL EVENT] - ID=[%d] Sender=[%d]\n\n", pDevEvent->EventData.deviceEvent.status, pDevEvent->EventData.deviceEvent.sender); -} -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -//}//namespace
--- a/G_functions/fPtr_func.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,235 +0,0 @@ -/* - * - 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. - * -*/ - -#ifndef fPtr_func_h -#define fPtr_func_h - -#include "cc3100_simplelink.h" - - -/* Note. C function pointers point to the functions below. */ -/* C++ member function pointers not used ? */ - -namespace mbed_cc3100 { - - - extern uint32_t g_PingPacketsRecv; - extern uint32_t g_GatewayIP; - extern uint32_t g_StationIP; - extern uint32_t g_DestinationIP; - extern uint32_t g_BytesReceived; // variable to store the file size - extern uint32_t g_Status; - extern uint8_t g_buff[MAX_BUFF_SIZE+1]; - extern int32_t g_SockID; - -}//namespace mbed_cc3100 - -using namespace mbed_cc3100; - -#ifdef __cplusplus -extern "C" { -#endif - - -void SimpleLinkPingReport(SlPingReport_t *pPingReport); - -/*! - \brief WLAN Async event handler - - \param[out] pSlWlanEvent pointer to SlWlanEvent_t data - - \par - Parameters: - - - <b>pSlWlanEvent->Event = SL_WLAN_CONNECT_EVENT </b>, STA or P2P client connection indication event - - pSlWlanEvent->EventData.STAandP2PModeWlanConnected main fields: - - ssid_name - - ssid_len - - bssid - - go_peer_device_name - - go_peer_device_name_len - - - <b>pSlWlanEvent->Event = SL_WLAN_DISCONNECT_EVENT </b>, STA or P2P client disconnection event - - pSlWlanEvent->EventData.STAandP2PModeDisconnected main fields: - - ssid_name - - ssid_len - - reason_code - - - <b>pSlWlanEvent->Event = SL_WLAN_STA_CONNECTED_EVENT </b>, AP/P2P(Go) connected STA/P2P(Client) - - pSlWlanEvent->EventData.APModeStaConnected fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_STA_DISCONNECTED_EVENT </b>, AP/P2P(Go) disconnected STA/P2P(Client) - - pSlWlanEvent->EventData.APModestaDisconnected fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_COMPLETE_EVENT </b> - - pSlWlanEvent->EventData.smartConfigStartResponse fields: - - status - - ssid_len - - ssid - - private_token_len - - private_token - - - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_STOP_EVENT </b> - - pSlWlanEvent->EventData.smartConfigStopResponse fields: - - status - - - <b>pSlWlanEvent->Event = SL_WLAN_P2P_DEV_FOUND_EVENT </b> - - pSlWlanEvent->EventData.P2PModeDevFound fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT </b> - - pSlWlanEvent->EventData.P2PModeNegReqReceived fields - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_CONNECTION_FAILED_EVENT </b>, P2P only - - pSlWlanEvent->EventData.P2PModewlanConnectionFailure fields: - - status -*/ -#if (defined(sl_WlanEvtHdlr)) -void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent); -#endif - -/*! - \brief NETAPP Async event handler - - \param[out] pSlNetApp pointer to SlNetAppEvent_t data - - \par - Parameters: - - <b>pSlWlanEvent->Event = SL_NETAPP_IPV4_IPACQUIRED_EVENT</b>, IPV4 acquired event - - pSlWlanEvent->EventData.ipAcquiredV4 fields: - - ip - - gateway - - dns - - - <b>pSlWlanEvent->Event = SL_NETAPP_IP_LEASED_EVENT</b>, AP or P2P go dhcp lease event - - pSlWlanEvent->EventData.ipLeased fields: - - ip_address - - lease_time - - mac - - - <b>pSlWlanEvent->Event = SL_NETAPP_IP_RELEASED_EVENT</b>, AP or P2P go dhcp ip release event - - pSlWlanEvent->EventData.ipReleased fields - - ip_address - - mac - - reason - -*/ -#if (defined(sl_NetAppEvtHdlr)) -void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent); -#endif - -/*! - \brief Socket Async event handler - - \param[out] pSlSockEvent pointer to SlSockEvent_t data - - \par - Parameters:\n - - <b>pSlSockEvent->Event = SL_SOCKET_TX_FAILED_EVENT</b> - - pSlSockEvent->EventData fields: - - sd - - status - - <b>pSlSockEvent->Event = SL_SOCKET_ASYNC_EVENT</b> - - pSlSockEvent->EventData fields: - - sd - - type: SSL_ACCEPT or RX_FRAGMENTATION_TOO_BIG or OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED - - val - -*/ -#if (defined(sl_SockEvtHdlr)) -void SimpleLinkSockEventHandler(SlSockEvent_t *pSock); -#endif - -void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent); - -void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent, SlHttpServerResponse_t *pHttpResponse); - -void _sl_HandleAsync_Accept(void *pVoidBuf); - -void _sl_HandleAsync_Connect(void *pVoidBuf); - -void _sl_HandleAsync_Select(void *pVoidBuf); - -void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf); - -void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf); - -void _sl_HandleAsync_PingResponse(void *pVoidBuf); - -void _sl_HandleAsync_Stop(void *pVoidBuf); - -_SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue); - -void _SlDrvDeviceEventHandler(void *pArgs); - -void _SlDrvNetAppEventHandler(void *pArgs); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -//}//namespace mbed_cc3100 - -#endif//fPtr_func_h - - - - - - -
--- a/main.cpp Mon Feb 23 21:10:13 2015 +0000 +++ b/main.cpp Thu Mar 19 14:35:32 2015 +0000 @@ -72,11 +72,14 @@ #elif (THIS_BOARD == ST_MBED_NUCLEOF103) cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF103 irq, nHib, cs, mosi, miso, sck Serial pc(SERIAL_TX, SERIAL_RX); +#elif (THIS_BOARD == Seed_Arch_Max) +cc3100 _cc3100(PE_5, PE_4, PE_6, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck +Serial pc(USBTX, USBRX); #else #endif -#define APPLICATION_VERSION "1.1.0" +#define APPLICATION_VERSION "1.2.0" /* * GLOBAL VARIABLES -- Start @@ -193,8 +196,8 @@ SlPingStartCommand_t PingParams = {0}; SlPingReport_t Report = {0}; - SlNetCfgIpV4Args_t ipV4 = {0}; - SlNetAppDhcpServerBasicOpt_t dhcpParams = {0}; +// SlNetCfgIpV4Args_t ipV4 = {0}; +// SlNetAppDhcpServerBasicOpt_t dhcpParams = {0}; uint8_t SecType = 0; int32_t role = ROLE_STA; @@ -215,6 +218,22 @@ retVal = _cc3100._wlan.sl_WlanSetMode(ROLE_AP); if(retVal < 0) LOOP_FOREVER(); + + /* Configure the SSID of the CC3100 */ + retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, + strlen(SSID_AP_MODE), (uint8_t *)SSID_AP_MODE); + if(retVal < 0) + LOOP_FOREVER(); + + SecType = SEC_TYPE_AP_MODE; + /* Configure the Security parameter the AP mode */ + retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (uint8_t *)&SecType); + if(retVal < 0) + LOOP_FOREVER(); + + retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, strlen(PASSWORD_AP_MODE), (uint8_t *)PASSWORD_AP_MODE); + if(retVal < 0) + LOOP_FOREVER(); retVal = _cc3100.sl_Stop(SL_STOP_TIMEOUT); if(retVal < 0) @@ -233,61 +252,6 @@ LOOP_FOREVER(); } } - - printf(" Ready to configue SSID\r\n"); - - /* Configure the SSID of the CC3100 */ - retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(SSID_AP_MODE), (uint8_t *)SSID_AP_MODE); - if(retVal < 0) - LOOP_FOREVER(); - - SecType = SEC_TYPE_AP_MODE; - /* Configure the Security parameter the AP mode */ - retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (uint8_t *)&SecType); - if(retVal < 0) - LOOP_FOREVER(); - - retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, strlen(PASSWORD_AP_MODE), (uint8_t *)PASSWORD_AP_MODE); - if(retVal < 0){ - LOOP_FOREVER(); - } - - ipV4.ipV4 = _cc3100._netcfg.SL_IPV4_VAL(192,168,0,1);//CONFIG_IP; - ipV4.ipV4Mask = _cc3100._netcfg.SL_IPV4_VAL(255,255,255,0);//CONFIG_MASK; - ipV4.ipV4Gateway = _cc3100._netcfg.SL_IPV4_VAL(192,168,0,1);//CONFIG_GATEWAY; - ipV4.ipV4DnsServer = _cc3100._netcfg.SL_IPV4_VAL(192,168,0,1);//CONFIG_DNS; - - /* Configure the Static IP */ - retVal = _cc3100._netcfg.sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE,1,sizeof(SlNetCfgIpV4Args_t), (uint8_t *)&ipV4); - if(retVal < 0) - LOOP_FOREVER(); - - dhcpParams.lease_time = IP_LEASE_TIME; - dhcpParams.ipv4_addr_start = _cc3100._netcfg.SL_IPV4_VAL(192,168,0,100);//DHCP_START_IP; - dhcpParams.ipv4_addr_last = _cc3100._netcfg.SL_IPV4_VAL(192,168,0,200);//DHCP_END_IP; - - retVal = _cc3100._netapp.sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT, sizeof(SlNetAppDhcpServerBasicOpt_t), (uint8_t*)&dhcpParams); - if(retVal < 0) - LOOP_FOREVER(); - - /* Restart the CC3100 */ - retVal = _cc3100.sl_Stop(SL_STOP_TIMEOUT); - if(retVal < 0) - LOOP_FOREVER(); - - g_Status = 0; - - role = _cc3100.sl_Start(0, 0, 0); - - if (ROLE_AP == role) { - /* If the device is in AP mode, we need to wait for this event before doing anything */ - while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) { - _cc3100._nonos._SlNonOsMainLoopTask(); - } - } else { - printf(" Device couldn't enter AP mode \n\r"); - LOOP_FOREVER(); - } printf(" Device started as Access Point\n\r"); /* Wait */ @@ -329,16 +293,16 @@ void station_app(void){ int32_t retVal = -1; - + /* Connecting to WLAN AP */ retVal = _cc3100.establishConnectionWithAP(); if(retVal < 0) { printf(" Failed to establish connection w/ an AP \n\r"); LOOP_FOREVER(); - } - + } printf(" Connection established w/ AP and IP is acquired \n\r"); + printf(" Pinging...! \n\r"); retVal = _cc3100.checkLanConnection(); if(retVal < 0) @@ -346,7 +310,8 @@ printf(" Device couldn't connect to LAN \n\r"); LOOP_FOREVER(); } - + printf(" Device successfully connected to the LAN\r\n"); + retVal = _cc3100.checkInternetConnection(); if(retVal < 0) { @@ -354,7 +319,7 @@ LOOP_FOREVER(); } - printf(" Device successfully connected to the LAN and internet \n\r"); + printf(" Device successfully connected to the internet \n\r"); }
--- a/mbed.bld Mon Feb 23 21:10:13 2015 +0000 +++ b/mbed.bld Thu Mar 19 14:35:32 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/9ad691361fac \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/487b796308b0 \ No newline at end of file
--- a/myBoardInit.h Mon Feb 23 21:10:13 2015 +0000 +++ b/myBoardInit.h Thu Mar 19 14:35:32 2015 +0000 @@ -22,11 +22,13 @@ #define EA_MBED_LPC4088 30 #define ST_MBED_NUCLEOF103 40 #define ST_MBED_NUCLEOF401 50 -#define UNDEFINED 60//add new board here +#define Seeed_Arch_Max 60 +#define UNDEFINED 70//add new board here #define THIS_BOARD MBED_BOARD_LPC1768 //#define THIS_BOARD ST_MBED_NUCLEOF411 //#define THIS_BOARD EA_MBED_LPC4088 //#define THIS_BOARD ST_MBED_NUCLEOF103 //#define THIS_BOARD ST_MBED_NUCLEOF401 +//#define THIS_BOARD Seeed_Arch_Max #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simplelink/G_functions/fPtr_func.cpp Thu Mar 19 14:35:32 2015 +0000 @@ -0,0 +1,1075 @@ +/* + * - 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 "cc3100_simplelink.h" + +#include "cc3100.h" +#include "cc3100_driver.h" +#include "fPtr_func.h" + + +using namespace mbed_cc3100; + +cc3100_driver *_driver; +cc3100_nonos *_nonos; +cc3100_netapp *_netapp; +cc3100 *_cc3100_; + +#ifdef __cplusplus +extern "C" { +#endif + +/* General Events handling*/ +#if defined (EXT_LIB_REGISTERED_GENERAL_EVENTS) + +typedef _SlEventPropogationStatus_e (*general_callback) (SlDeviceEvent_t *); + +static const general_callback general_callbacks[] = +{ +#ifdef SlExtLib1GeneralEventHandler + SlExtLib1GeneralEventHandler, +#endif + +#ifdef SlExtLib2GeneralEventHandler + SlExtLib2GeneralEventHandler, +#endif + +#ifdef SlExtLib3GeneralEventHandler + SlExtLib3GeneralEventHandler, +#endif + +#ifdef SlExtLib4GeneralEventHandler + SlExtLib4GeneralEventHandler, +#endif + +#ifdef SlExtLib5GeneralEventHandler + SlExtLib5GeneralEventHandler, +#endif +}; + +#undef _SlDrvHandleGeneralEvents + +/******************************************************************** + _SlDrvHandleGeneralEvents + Iterates through all the general(device) event handlers which are + registered by the external libs/user application. +*********************************************************************/ +void _SlDrvHandleGeneralEvents(SlDeviceEvent_t *slGeneralEvent) +{ + uint8_t i; + + /* Iterate over all the extenal libs handlers */ + for ( i = 0 ; i < sizeof(general_callbacks)/sizeof(general_callbacks[0]) ; i++ ) + { + if (EVENT_PROPAGATION_BLOCK == general_callbacks[i](slGeneralEvent) ) + { + /* exit immediately and do not call the user specific handler as well */ + return; + } + } + +/* At last call the Application specific handler if registered */ +#ifdef sl_GeneralEvtHdlr + sl_GeneralEvtHdlr(slGeneralEvent); +#endif + +} +#endif + + + +/* WLAN Events handling*/ + +#if defined (EXT_LIB_REGISTERED_WLAN_EVENTS) + +typedef _SlEventPropogationStatus_e (*wlan_callback) (SlWlanEvent_t *); + +static wlan_callback wlan_callbacks[] = +{ +#ifdef SlExtLib1WlanEventHandler + SlExtLib1WlanEventHandler, +#endif + +#ifdef SlExtLib2WlanEventHandler + SlExtLib2WlanEventHandler, +#endif + +#ifdef SlExtLib3WlanEventHandler + SlExtLib3WlanEventHandler, +#endif + +#ifdef SlExtLib4WlanEventHandler + SlExtLib4WlanEventHandler, +#endif + +#ifdef SlExtLib5WlanEventHandler + SlExtLib5WlanEventHandler, +#endif +}; + +#undef _SlDrvHandleWlanEvents + +/*********************************************************** + _SlDrvHandleWlanEvents + Iterates through all the wlan event handlers which are + registered by the external libs/user application. +************************************************************/ +void _SlDrvHandleWlanEvents(SlWlanEvent_t *slWlanEvent) +{ + uint8_t i; + + /* Iterate over all the extenal libs handlers */ + for ( i = 0 ; i < sizeof(wlan_callbacks)/sizeof(wlan_callbacks[0]) ; i++ ) + { + if ( EVENT_PROPAGATION_BLOCK == wlan_callbacks[i](slWlanEvent) ) + { + /* exit immediately and do not call the user specific handler as well */ + return; + } + } + +/* At last call the Application specific handler if registered */ +#ifdef sl_WlanEvtHdlr + sl_WlanEvtHdlr(slWlanEvent); +#endif + +} +#endif + + +/* NetApp Events handling */ +#if defined (EXT_LIB_REGISTERED_NETAPP_EVENTS) + +typedef _SlEventPropogationStatus_e (*netApp_callback) (SlNetAppEvent_t *); + +static const netApp_callback netApp_callbacks[] = +{ +#ifdef SlExtLib1NetAppEventHandler + SlExtLib1NetAppEventHandler, +#endif + +#ifdef SlExtLib2NetAppEventHandler + SlExtLib2NetAppEventHandler, +#endif + +#ifdef SlExtLib3NetAppEventHandler + SlExtLib3NetAppEventHandler, +#endif + +#ifdef SlExtLib4NetAppEventHandler + SlExtLib4NetAppEventHandler, +#endif + +#ifdef SlExtLib5NetAppEventHandler + SlExtLib5NetAppEventHandler, +#endif +}; + +#undef _SlDrvHandleNetAppEvents + +/************************************************************ + _SlDrvHandleNetAppEvents + Iterates through all the net app event handlers which are + registered by the external libs/user application. +************************************************************/ +void _SlDrvHandleNetAppEvents(SlNetAppEvent_t *slNetAppEvent) +{ + uint8_t i; + + /* Iterate over all the extenal libs handlers */ + for ( i = 0 ; i < sizeof(netApp_callbacks)/sizeof(netApp_callbacks[0]) ; i++ ) + { + if (EVENT_PROPAGATION_BLOCK == netApp_callbacks[i](slNetAppEvent) ) + { + /* exit immediately and do not call the user specific handler as well */ + return; + } + } + +/* At last call the Application specific handler if registered */ +#ifdef sl_NetAppEvtHdlr + sl_NetAppEvtHdlr(slNetAppEvent); +#endif + +} +#endif + + +/* Http Server Events handling */ +#if defined (EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS) + +typedef _SlEventPropogationStatus_e (*httpServer_callback) (SlHttpServerEvent_t*, SlHttpServerResponse_t*); + +static const httpServer_callback httpServer_callbacks[] = +{ +#ifdef SlExtLib1HttpServerEventHandler + SlExtLib1HttpServerEventHandler, +#endif + +#ifdef SlExtLib2HttpServerEventHandler + SlExtLib2HttpServerEventHandler, +#endif + +#ifdef SlExtLib3HttpServerEventHandler + SlExtLib3HttpServerEventHandler, +#endif + +#ifdef SlExtLib4HttpServerEventHandler + SlExtLib4HttpServerEventHandler, +#endif + +#ifdef SlExtLib5HttpServerEventHandler + SlExtLib5HttpServerEventHandler, +#endif +}; + +#undef _SlDrvHandleHttpServerEvents + +/******************************************************************* + _SlDrvHandleHttpServerEvents + Iterates through all the http server event handlers which are + registered by the external libs/user application. +********************************************************************/ +void _SlDrvHandleHttpServerEvents(SlHttpServerEvent_t *slHttpServerEvent, SlHttpServerResponse_t *slHttpServerResponse) +{ + _u8 i; + + /* Iterate over all the external libs handlers */ + for ( i = 0 ; i < sizeof(httpServer_callbacks)/sizeof(httpServer_callbacks[0]) ; i++ ) + { + if ( EVENT_PROPAGATION_BLOCK == httpServer_callbacks[i](slHttpServerEvent, slHttpServerResponse) ) + { + /* exit immediately and do not call the user specific handler as well */ + return; + } + } + +/* At last call the Application specific handler if registered */ +#ifdef sl_HttpServerCallback + sl_HttpServerCallback(slHttpServerEvent, slHttpServerResponse); +#endif + +} +#endif + + +/* Socket Events */ +#if defined (EXT_LIB_REGISTERED_SOCK_EVENTS) + +typedef _SlEventPropogationStatus_e (*sock_callback) (SlSockEvent_t *); + +static const sock_callback sock_callbacks[] = +{ +#ifdef SlExtLib1SockEventHandler + SlExtLib1SockEventHandler, +#endif + +#ifdef SlExtLib2SockEventHandler + SlExtLib2SockEventHandler, +#endif + +#ifdef SlExtLib3SockEventHandler + SlExtLib3SockEventHandler, +#endif + +#ifdef SlExtLib4SockEventHandler + SlExtLib4SockEventHandler, +#endif + +#ifdef SlExtLib5SockEventHandler + SlExtLib5SockEventHandler, +#endif +}; + +/************************************************************* + _SlDrvHandleSockEvents + Iterates through all the socket event handlers which are + registered by the external libs/user application. +**************************************************************/ +void _SlDrvHandleSockEvents(SlSockEvent_t *slSockEvent) +{ + uint8_t i; + + /* Iterate over all the external libs handlers */ + for ( i = 0 ; i < sizeof(sock_callbacks)/sizeof(sock_callbacks[0]) ; i++ ) + { + if ( EVENT_PROPAGATION_BLOCK == sock_callbacks[i](slSockEvent) ) + { + /* exit immediately and do not call the user specific handler as well */ + return; + } + } + +/* At last call the Application specific handler if registered */ +#ifdef sl_SockEvtHdlr + sl_SockEvtHdlr(slSockEvent); +#endif + +} + +#endif + +/*! + \brief This function handles ping report events + + \param[in] pPingReport holds the ping report statistics + + \return None + + \note + + \warning +*/ +void SimpleLinkPingReport(SlPingReport_t *pPingReport) +{ + _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE); + + if(pPingReport == NULL) + printf(" [PING REPORT] NULL Pointer Error\r\n"); + + g_PingPacketsRecv = pPingReport->PacketsReceived; +} + + +/*******************************************************************************/ +/* _sl_HandleAsync_Accept */ +/*******************************************************************************/ +#ifndef SL_TINY_EXT +void _sl_HandleAsync_Accept(void *pVoidBuf) +{ + _SocketAddrResponse_u *pMsgArgs = (_SocketAddrResponse_u *)_SL_RESP_ARGS_START(pVoidBuf); + + _driver->_SlDrvProtectionObjLockWaitForever(); + + VERIFY_PROTOCOL(( pMsgArgs->IpV4.sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS); + VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); + + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,sizeof(_SocketAddrResponse_u)); + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + + _driver->_SlDrvProtectionObjUnLock(); + return; +} + +/*******************************************************************************/ +/* _sl_HandleAsync_Connect */ +/*******************************************************************************/ +void _sl_HandleAsync_Connect(void *pVoidBuf) +{ + _SocketResponse_t *pMsgArgs = (_SocketResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + + _driver->_SlDrvProtectionObjLockWaitForever(); + + VERIFY_PROTOCOL((pMsgArgs->sd & BSD_SOCKET_ID_MASK) <= SL_MAX_SOCKETS); + VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); + + ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->sd = pMsgArgs->sd; + ((_SocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->statusOrLen = pMsgArgs->statusOrLen; + + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + _driver->_SlDrvProtectionObjUnLock(); + return; +} + +/*******************************************************************************/ +/* _sl_HandleAsync_Select */ +/*******************************************************************************/ +void _sl_HandleAsync_Select(void *pVoidBuf) +{ + _SelectAsyncResponse_t *pMsgArgs = (_SelectAsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + + _driver->_SlDrvProtectionObjLockWaitForever(); + + VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); + + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_SelectAsyncResponse_t)); + + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + _driver->_SlDrvProtectionObjUnLock(); + + return; +} + +#endif + +/******************************************************************************/ +/* _sl_HandleAsync_DnsGetHostByName */ +/******************************************************************************/ +void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf) +{ + _GetHostByNameIPv4AsyncResponse_t *pMsgArgs = (_GetHostByNameIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + + _driver->_SlDrvProtectionObjLockWaitForever(); + + VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); + + /*IPv6 */ + if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) { + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv6AsyncResponse_t)); + } + /*IPv4 */ + else + { + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_GetHostByNameIPv4AsyncResponse_t)); + } + + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + _driver->_SlDrvProtectionObjUnLock(); + + return; +} + +/******************************************************************************/ + +/****************************************************************************** + _sl_HandleAsync_DnsGetHostByService + + CALLER NWP - Async event on sl_DnsGetHostByService with IPv4 Family + + + DESCRIPTION: + + Async event on sl_DnsGetHostByService command with IPv4 Family. + Return service attributes like IP address, port and text according to service name. + The user sets a service name Full/Part (see example below), and should get the: + 1. IP of the service + 2. The port of service. + 3. The text of service. + + Hence it can make a connection to the specific service and use it. + It is similar to get host by name method. + + It is done by a single shot query with PTR type on the service name. + + + + Note: + 1. The return's attributes are belonged to first service that is found. + It can be other services with the same service name will response to + the query. The results of these responses are saved in the peer cache of the NWP, and + should be read by another API. + + + PARAMETERS: + + pVoidBuf - is point to opcode of the event. + it contains the outputs that are given to the user + + outputs description: + + 1.out_pAddr[] - output: Contain the IP address of the service. + 2.out_pPort - output: Contain the port of the service. + 3.inout_TextLen - Input: Contain the max length of the text that the user wants to get. + it means that if the test of service is bigger that its value than + the text is cut to inout_TextLen value. + Output: Contain the length of the text that is returned. Can be full text or part + of the text (see above). + + 4.out_pText - Contain the text of the service (full or part see above- inout_TextLen description). + + * + + + RETURNS: success or fail. + +******************************************************************************/ +#ifndef SL_TINY_EXT +void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf) +{ + _GetHostByServiceAsyncResponse_t* Res; + uint16_t TextLen; + uint16_t UserTextLen; + + /*pVoidBuf - is point to opcode of the event.*/ + + /*set pMsgArgs to point to the attribute of the event.*/ + _GetHostByServiceIPv4AsyncResponse_t *pMsgArgs = (_GetHostByServiceIPv4AsyncResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + + VERIFY_SOCKET_CB(NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs); + + /*IPv6*/ + if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) { + return; + } + /*IPv4*/ + else { + /************************************************************************************************* + + 1. Copy the attribute part of the evnt to the attribute part of the response + memcpy(g_pCB->GetHostByServiceCB.pAsyncRsp, pMsgArgs, sizeof(_GetHostByServiceIPv4AsyncResponse_t)); + + set to TextLen the text length of the service.*/ + TextLen = pMsgArgs->TextLen; + + /*Res pointed to mDNS global object struct */ + Res = (_GetHostByServiceAsyncResponse_t*)g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs; + + + + /*It is 4 bytes so we avoid from memcpy*/ + Res->out_pAddr[0] = pMsgArgs->Address; + Res->out_pPort[0] = pMsgArgs->Port; + Res->Status = pMsgArgs->Status; + + /*set to TextLen the text length of the user (input fromthe user).*/ + UserTextLen = Res->inout_TextLen[0]; + + /*Cut the service text if the user requested for smaller text.*/ + UserTextLen = (TextLen <= UserTextLen) ? TextLen : UserTextLen; + Res->inout_TextLen[0] = UserTextLen ; + + /************************************************************************************************** + + 2. Copy the payload part of the evnt (the text) to the payload part of the response + the lenght of the copy is according to the text length in the attribute part. */ + + + memcpy(Res->out_pText , + (int8_t *)(& pMsgArgs[1]), /* & pMsgArgs[1] -> 1st byte after the fixed header = 1st byte of variable text.*/ + UserTextLen); + + + /**************************************************************************************************/ + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + return; + } +} +#endif + +/*****************************************************************************/ +/* _sl_HandleAsync_PingResponse */ +/*****************************************************************************/ +#ifndef SL_TINY_EXT +void _sl_HandleAsync_PingResponse(void *pVoidBuf) +{ + _PingReportResponse_t *pMsgArgs = (_PingReportResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + SlPingReport_t pingReport; + + if(pPingCallBackFunc) { + _netapp->CopyPingResultsToReport(pMsgArgs,&pingReport); + pPingCallBackFunc(&pingReport); + } else { + + _driver->_SlDrvProtectionObjLockWaitForever(); + VERIFY_SOCKET_CB(NULL != g_pCB->PingCB.PingAsync.pAsyncRsp); + + if (NULL != g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs) { + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_PingReportResponse_t)); + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + } + _driver->_SlDrvProtectionObjUnLock(); + } + return; +} +#endif + +/* ******************************************************************************/ +/* _SlDrvMsgReadSpawnCtx */ +/* ******************************************************************************/ +_SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue) +{ + +#ifdef SL_POLLING_MODE_USED + int16_t retCode = OSI_OK; + /* for polling based systems */ + do { + retCode = sl_LockObjLock(&g_pCB->GlobalLockObj, 0); + if ( OSI_OK != retCode ) { + if (TRUE == g_pCB->IsCmdRespWaited) { + OSI_RET_OK_CHECK( sl_SyncObjSignal(&g_pCB->CmdSyncObj) ); + return SL_RET_CODE_OK; + } + } + + } while (OSI_OK != retCode); + +#else + + OSI_RET_OK_CHECK(_nonos->sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER) ); + +#endif + + g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;/* buffer must be allocated by _SlDrvMsgRead */ + g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL; + g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS;/* init to illegal value and verify it's overwritten with the valid one */ + + /* Messages might have been read by CmdResp context. Therefore after */ + /* getting LockObj, check again where the Pending Rx Msg is still present. */ + if(FALSE == (_driver->_SL_PENDING_RX_MSG(g_pCB))) { + OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); + return SL_RET_CODE_OK; + } + + VERIFY_RET_OK(_driver->_SlDrvMsgRead()); + + g_pCB->RxDoneCnt++; + + switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) { + case ASYNC_EVT_CLASS: + /* If got here and protected by LockObj a message is waiting */ + /* to be read */ + VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf); + + _driver->_SlAsyncEventGenericHandler(); + +#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) + g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL; +#else + free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); +#endif + break; + case DUMMY_MSG_CLASS: + case RECV_RESP_CLASS: + /* These types are legal in this context. Do nothing */ + break; + case CMD_RESP_CLASS: + /* Command response is illegal in this context. */ + /* No 'break' here: Assert! */ + default: + VERIFY_PROTOCOL(0); + } + + OSI_RET_OK_CHECK(_nonos->sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); + + return(SL_RET_CODE_OK); + +} + +/*************************************************************************** +_sl_HandleAsync_Stop - handles stop signalling to +a waiting object +****************************************************************************/ +void _sl_HandleAsync_Stop(void *pVoidBuf) +{ + _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pVoidBuf); + + VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp); + + _driver->_SlDrvProtectionObjLockWaitForever(); + + memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_BasicResponse_t)); + _driver->_SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj); + _driver->_SlDrvProtectionObjUnLock(); + return; +} + +/****************************************************************************** +_SlDrvDeviceEventHandler - handles internally device async events +******************************************************************************/ +void _SlDrvDeviceEventHandler(void *pArgs) +{ + _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs; + + switch(pHdr->GenHeader.Opcode) { + case SL_OPCODE_DEVICE_INITCOMPLETE: + _cc3100_->_sl_HandleAsync_InitComplete(pHdr); + + break; + case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE: + _sl_HandleAsync_Stop(pHdr); + + break; + + + case SL_OPCODE_DEVICE_ABORT: + { +#if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS) + SlDeviceEvent_t devHandler; + devHandler.Event = SL_DEVICE_ABORT_ERROR_EVENT; + devHandler.EventData.deviceReport.AbortType = *((uint32_t*)pArgs + 2); + devHandler.EventData.deviceReport.AbortData = *((uint32_t*)pArgs + 3); + _SlDrvHandleGeneralEvents(&devHandler); +#endif + } + break; + case SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR: +#if defined (sl_GeneralEvtHdlr) || defined(EXT_LIB_REGISTERED_GENERAL_EVENTS) + { + _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pHdr); + SlDeviceEvent_t devHandler; + devHandler.Event = SL_DEVICE_FATAL_ERROR_EVENT; + devHandler.EventData.deviceEvent.status = pMsgArgs->status & 0xFF; + devHandler.EventData.deviceEvent.sender = (SlErrorSender_e)((pMsgArgs->status >> 8) & 0xFF); + _SlDrvHandleGeneralEvents(&devHandler); + } +#endif + break; + default: + //SL_ERROR_TRACE2(MSG_306, "ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); + printf("ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); + + } +} + +/*****************************************************************************/ +/* _SlDrvNetAppEventHandler */ +/*****************************************************************************/ +void _SlDrvNetAppEventHandler(void *pArgs) +{ + _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs; +#if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS) + SlHttpServerEvent_t httpServerEvent; + SlHttpServerResponse_t httpServerResponse; +#endif + switch(pHdr->GenHeader.Opcode) { + case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE: + case SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE_V6: + _sl_HandleAsync_DnsGetHostByName(pArgs); + break; +#ifndef SL_TINY_EXT + case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE: + case SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE_V6: + _sl_HandleAsync_DnsGetHostByService(pArgs); + break; + case SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE: + _sl_HandleAsync_PingResponse(pArgs); + break; +#endif + +#if defined(sl_HttpServerCallback) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS) + case SL_OPCODE_NETAPP_HTTPGETTOKENVALUE: { + + uint8_t *pTokenName; + slHttpServerData_t Token_value; + sl_NetAppHttpServerGetToken_t *httpGetToken = (sl_NetAppHttpServerGetToken_t *)_SL_RESP_ARGS_START(pHdr); + pTokenName = (uint8_t *)((sl_NetAppHttpServerGetToken_t *)httpGetToken + 1); + + httpServerResponse.Response = SL_NETAPP_HTTPSETTOKENVALUE; + httpServerResponse.ResponseData.token_value.len = MAX_TOKEN_VALUE_LEN; + + /* Reuse the async buffer for getting the token value response from the user */ + httpServerResponse.ResponseData.token_value.data = (uint8_t *)_SL_RESP_ARGS_START(pHdr) + MAX_TOKEN_NAME_LEN; + httpServerEvent.Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT; + + httpServerEvent.EventData.httpTokenName.len = httpGetToken->token_name_len; + httpServerEvent.EventData.httpTokenName.data = pTokenName; + + Token_value.token_name = pTokenName; + + _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse); + + Token_value.value_len = httpServerResponse.ResponseData.token_value.len; + Token_value.name_len = httpServerEvent.EventData.httpTokenName.len; + + Token_value.token_value = httpServerResponse.ResponseData.token_value.data; + + + _netapp->sl_NetAppSendTokenValue(&Token_value); +#endif + } + break; + + case SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE: { +#ifdef sl_HttpServerCallback + uint8_t *pPostParams; + + sl_NetAppHttpServerPostToken_t *httpPostTokenArgs = (sl_NetAppHttpServerPostToken_t *)_SL_RESP_ARGS_START(pHdr); + pPostParams = (uint8_t *)((sl_NetAppHttpServerPostToken_t *)httpPostTokenArgs + 1); + + httpServerEvent.Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT; + + httpServerEvent.EventData.httpPostData.action.len = httpPostTokenArgs->post_action_len; + httpServerEvent.EventData.httpPostData.action.data = pPostParams; + pPostParams+=httpPostTokenArgs->post_action_len; + + httpServerEvent.EventData.httpPostData.token_name.len = httpPostTokenArgs->token_name_len; + httpServerEvent.EventData.httpPostData.token_name.data = pPostParams; + pPostParams+=httpPostTokenArgs->token_name_len; + + httpServerEvent.EventData.httpPostData.token_value.len = httpPostTokenArgs->token_value_len; + httpServerEvent.EventData.httpPostData.token_value.data = pPostParams; + + httpServerResponse.Response = SL_NETAPP_RESPONSE_NONE; + + + _SlDrvHandleHttpServerEvents (&httpServerEvent, &httpServerResponse); + } + break; +#endif + default: + SL_ERROR_TRACE2(MSG_305, "ASSERT: _SlDrvNetAppEventHandler : invalid opcode = 0x%x = %i", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode); + VERIFY_PROTOCOL(0); + } +} + +/* + * ASYNCHRONOUS EVENT HANDLERS -- Start + */ + +/*! + \brief This function handles WLAN events + + \param[in] pWlanEvent is the event passed to the handler + + \return None + + \note + + \warning +*/ +#if (defined(sl_WlanEvtHdlr)) +void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) +{ + unsigned char g_ucConnectionSSID[32+1]; //Connection SSID + unsigned char g_ucConnectionBSSID[6]; //Connection BSSID + + if(pWlanEvent == NULL) + printf(" [WLAN EVENT] NULL Pointer Error \n\r"); + + switch(pWlanEvent->Event) { + case SL_WLAN_CONNECT_EVENT: { + _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION); + + // Copy new connection SSID and BSSID to global parameters + memcpy(g_ucConnectionSSID,pWlanEvent->EventData. + STAandP2PModeWlanConnected.ssid_name, + pWlanEvent->EventData.STAandP2PModeWlanConnected.ssid_len); + memcpy(g_ucConnectionBSSID, + pWlanEvent->EventData.STAandP2PModeWlanConnected.bssid, + SL_BSSID_LENGTH); + + printf("[WLAN EVENT] STA Connected to the AP: %s ," + "BSSID: %x:%x:%x:%x:%x:%x\n\r", + g_ucConnectionSSID,g_ucConnectionBSSID[0], + g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], + g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], + g_ucConnectionBSSID[5]); + /* + * Information about the connected AP (like name, MAC etc) will be + * available in 'slWlanConnectAsyncResponse_t' - Applications + * can use it if required + * + * slWlanConnectAsyncResponse_t *pEventData = NULL; + * pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected; + * + */ + } + break; + + case SL_WLAN_DISCONNECT_EVENT: { + slWlanConnectAsyncResponse_t* pEventData = NULL; + + _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_CONNECTION); + _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED); + + pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected; + + /* If the user has initiated 'Disconnect' request, 'reason_code' is SL_USER_INITIATED_DISCONNECTION */ + if(SL_USER_INITIATED_DISCONNECTION == pEventData->reason_code) { + printf("[WLAN EVENT]Device disconnected from the AP: %s," + "BSSID: %x:%x:%x:%x:%x:%x on application's request \n\r", + g_ucConnectionSSID,g_ucConnectionBSSID[0], + g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], + g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], + g_ucConnectionBSSID[5]); + } else { + printf("[WLAN ERROR]Device disconnected from the AP AP: %s," + "BSSID: %x:%x:%x:%x:%x:%x on an ERROR..!! \n\r", + g_ucConnectionSSID,g_ucConnectionBSSID[0], + g_ucConnectionBSSID[1],g_ucConnectionBSSID[2], + g_ucConnectionBSSID[3],g_ucConnectionBSSID[4], + g_ucConnectionBSSID[5]); + } + memset(g_ucConnectionSSID,0,sizeof(g_ucConnectionSSID)); + memset(g_ucConnectionBSSID,0,sizeof(g_ucConnectionBSSID)); + } + break; + + case SL_WLAN_STA_CONNECTED_EVENT: { + _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED); + } + break; + + case SL_WLAN_STA_DISCONNECTED_EVENT: { + _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_STA_CONNECTED); + _cc3100_->CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED); + } + break; + + default: { + printf("[WLAN EVENT] Unexpected event [0x%x]\n\r",pWlanEvent->Event); + } + break; + } +} +#endif + +/*! + \brief This function handles events for IP address acquisition via DHCP + indication + + \param[in] pNetAppEvent is the event passed to the handler + + \return None + + \note + + \warning +*/ +#if (defined(sl_NetAppEvtHdlr)) +void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) +{ + + if(pNetAppEvent == NULL){ + printf(" [NETAPP EVENT] NULL Pointer Error \n\r"); + } + + switch(pNetAppEvent->Event) { + case SL_NETAPP_IPV4_IPACQUIRED_EVENT: { + SlIpV4AcquiredAsync_t *pEventData = NULL; + _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED); + pEventData = &pNetAppEvent->EventData.ipAcquiredV4; + g_GatewayIP = pEventData->gateway; + + printf("[NETAPP EVENT] IP Acquired: IP=%d.%d.%d.%d , ""Gateway=%d.%d.%d.%d\n\r", + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,3), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,2), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,1), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.ip,0), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,3), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,2), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,1), + _cc3100_->_netcfg.SL_IPV4_BYTE(pNetAppEvent->EventData.ipAcquiredV4.gateway,0)); + + } + break; + + case SL_NETAPP_IP_LEASED_EVENT: { + g_StationIP = pNetAppEvent->EventData.ipLeased.ip_address; + _cc3100_->SET_STATUS_BIT(g_Status, STATUS_BIT_IP_LEASED); + + } + break; + + default: { + printf("[NETAPP EVENT] Unexpected event [0x%x] \n\r",pNetAppEvent->Event); + } + break; + } +} +#endif + +/*! + \brief This function handles socket events indication + + \param[in] pSock is the event passed to the handler + + \return None +*/ +#if (defined(sl_SockEvtHdlr)) +void SimpleLinkSockEventHandler(SlSockEvent_t *pSock) +{ + if(pSock == NULL) + printf(" [SOCK EVENT] NULL Pointer Error \n\r"); + + switch( pSock->Event ) + { + case SL_SOCKET_TX_FAILED_EVENT: + /* + * TX Failed + * + * Information about the socket descriptor and status will be + * available in 'SlSockEventData_t' - Applications can use it if + * required + * + * SlSockEventData_t *pEventData = NULL; + * pEventData = & pSock->EventData; + */ + + switch( pSock->socketAsyncEvent.SockTxFailData.status ) + { + case SL_ECLOSE: + printf(" [SOCK EVENT] Close socket operation, failed to transmit all queued packets\n\r"); + break; + default: + printf("[SOCK ERROR] - TX FAILED : socket %d , reason""(%d) \n\n", pSock->socketAsyncEvent.SockTxFailData.sd, pSock->socketAsyncEvent.SockTxFailData.status); + break; + } + break; + + default: + printf("[SOCK EVENT] - Unexpected Event [%x0x]\n\n",pSock->Event); + break; + } +} +#endif + +/*! + \brief This function handles callback for the HTTP server events + + \param[in] pHttpEvent - Contains the relevant event information + \param[in] pHttpResponse - Should be filled by the user with the + relevant response information + + \return None + + \note + + \warning +*/ +#if (defined(sl_HttpServerCallback)) +void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent, SlHttpServerResponse_t *pHttpResponse) +{ + /* + * This application doesn't work with HTTP server - Hence these + * events are not handled here + */ + printf(" [HTTP EVENT] Unexpected event \n\r"); +} +#endif +/*! + \brief This function handles general error events indication + + \param[in] pDevEvent is the event passed to the handler + + \return None +*/ +#if (defined(sl_GeneralEvtHdlr)) +void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent) +{ + /* + * Most of the general errors are not FATAL are are to be handled + * appropriately by the application + */ + printf("[GENERAL EVENT] - ID=[%d] Sender=[%d]\n\n", pDevEvent->EventData.deviceEvent.status, pDevEvent->EventData.deviceEvent.sender); +} +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +//}//namespace
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simplelink/G_functions/fPtr_func.h Thu Mar 19 14:35:32 2015 +0000 @@ -0,0 +1,241 @@ +/* + * - 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. + * +*/ + +#ifndef fPtr_func_h +#define fPtr_func_h + +#include "cc3100_simplelink.h" + + +/* Note. C function pointers point to the functions below. */ +/* C++ member function pointers not used ? */ + +namespace mbed_cc3100 { + + + extern uint32_t g_PingPacketsRecv; + extern uint32_t g_GatewayIP; + extern uint32_t g_StationIP; + extern uint32_t g_DestinationIP; + extern uint32_t g_BytesReceived; // variable to store the file size + extern uint32_t g_Status; + extern uint8_t g_buff[MAX_BUFF_SIZE+1]; + extern int32_t g_SockID; + +}//namespace mbed_cc3100 + +using namespace mbed_cc3100; + +#ifdef __cplusplus +extern "C" { +#endif + + +void SimpleLinkPingReport(SlPingReport_t *pPingReport); + +/*! + \brief WLAN Async event handler + + \param[out] pSlWlanEvent pointer to SlWlanEvent_t data + + \par + Parameters: + + - <b>pSlWlanEvent->Event = SL_WLAN_CONNECT_EVENT </b>, STA or P2P client connection indication event + - pSlWlanEvent->EventData.STAandP2PModeWlanConnected main fields: + - ssid_name + - ssid_len + - bssid + - go_peer_device_name + - go_peer_device_name_len + + - <b>pSlWlanEvent->Event = SL_WLAN_DISCONNECT_EVENT </b>, STA or P2P client disconnection event + - pSlWlanEvent->EventData.STAandP2PModeDisconnected main fields: + - ssid_name + - ssid_len + - reason_code + + - <b>pSlWlanEvent->Event = SL_WLAN_STA_CONNECTED_EVENT </b>, AP/P2P(Go) connected STA/P2P(Client) + - pSlWlanEvent->EventData.APModeStaConnected fields: + - go_peer_device_name + - mac + - go_peer_device_name_len + - wps_dev_password_id + - own_ssid: relevant for event sta-connected only + - own_ssid_len: relevant for event sta-connected only + + - <b>pSlWlanEvent->Event = SL_WLAN_STA_DISCONNECTED_EVENT </b>, AP/P2P(Go) disconnected STA/P2P(Client) + - pSlWlanEvent->EventData.APModestaDisconnected fields: + - go_peer_device_name + - mac + - go_peer_device_name_len + - wps_dev_password_id + - own_ssid: relevant for event sta-connected only + - own_ssid_len: relevant for event sta-connected only + + - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_COMPLETE_EVENT </b> + - pSlWlanEvent->EventData.smartConfigStartResponse fields: + - status + - ssid_len + - ssid + - private_token_len + - private_token + + - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_STOP_EVENT </b> + - pSlWlanEvent->EventData.smartConfigStopResponse fields: + - status + + - <b>pSlWlanEvent->Event = SL_WLAN_P2P_DEV_FOUND_EVENT </b> + - pSlWlanEvent->EventData.P2PModeDevFound fields: + - go_peer_device_name + - mac + - go_peer_device_name_len + - wps_dev_password_id + - own_ssid: relevant for event sta-connected only + - own_ssid_len: relevant for event sta-connected only + + - <b>pSlWlanEvent->Event = SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT </b> + - pSlWlanEvent->EventData.P2PModeNegReqReceived fields + - go_peer_device_name + - mac + - go_peer_device_name_len + - wps_dev_password_id + - own_ssid: relevant for event sta-connected only + + - <b>pSlWlanEvent->Event = SL_WLAN_CONNECTION_FAILED_EVENT </b>, P2P only + - pSlWlanEvent->EventData.P2PModewlanConnectionFailure fields: + - status +*/ +#if (defined(sl_WlanEvtHdlr)) +void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent); +#endif + +/*! + \brief NETAPP Async event handler + + \param[out] pSlNetApp pointer to SlNetAppEvent_t data + + \par + Parameters: + - <b>pSlWlanEvent->Event = SL_NETAPP_IPV4_IPACQUIRED_EVENT</b>, IPV4 acquired event + - pSlWlanEvent->EventData.ipAcquiredV4 fields: + - ip + - gateway + - dns + + - <b>pSlWlanEvent->Event = SL_NETAPP_IP_LEASED_EVENT</b>, AP or P2P go dhcp lease event + - pSlWlanEvent->EventData.ipLeased fields: + - ip_address + - lease_time + - mac + + - <b>pSlWlanEvent->Event = SL_NETAPP_IP_RELEASED_EVENT</b>, AP or P2P go dhcp ip release event + - pSlWlanEvent->EventData.ipReleased fields + - ip_address + - mac + - reason + +*/ +#if (defined(sl_NetAppEvtHdlr)) +void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent); +#endif + +/*! + \brief Socket Async event handler + + \param[out] pSlSockEvent pointer to SlSockEvent_t data + + \par + Parameters:\n + - <b>pSlSockEvent->Event = SL_SOCKET_TX_FAILED_EVENT</b> + - pSlSockEvent->EventData fields: + - sd + - status + - <b>pSlSockEvent->Event = SL_SOCKET_ASYNC_EVENT</b> + - pSlSockEvent->EventData fields: + - sd + - type: SSL_ACCEPT or RX_FRAGMENTATION_TOO_BIG or OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED + - val + +*/ +#if (defined(sl_SockEvtHdlr)) +void SimpleLinkSockEventHandler(SlSockEvent_t *pSock); +#endif + +void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent); + +void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent, SlHttpServerResponse_t *pHttpResponse); +#ifndef SL_TINY_EXT +void _sl_HandleAsync_Accept(void *pVoidBuf); + +void _sl_HandleAsync_Select(void *pVoidBuf); + +void _sl_HandleAsync_DnsGetHostByService(void *pVoidBuf); + +void _sl_HandleAsync_PingResponse(void *pVoidBuf); +#endif +void _sl_HandleAsync_Connect(void *pVoidBuf); + +void _sl_HandleAsync_DnsGetHostByName(void *pVoidBuf); + +void _sl_HandleAsync_Stop(void *pVoidBuf); + +_SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue); + +void _SlDrvDeviceEventHandler(void *pArgs); + +void _SlDrvNetAppEventHandler(void *pArgs); + +void _SlDrvHandleHttpServerEvents(SlHttpServerEvent_t *slHttpServerEvent, SlHttpServerResponse_t *slHttpServerResponse); +void _SlDrvHandleSockEvents(SlSockEvent_t *slSockEvent); +void _SlDrvHandleNetAppEvents(SlNetAppEvent_t *slNetAppEvent); +void _SlDrvHandleWlanEvents(SlWlanEvent_t *slWlanEvent); +void _SlDrvHandleGeneralEvents(SlDeviceEvent_t *slGeneralEvent); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +//}//namespace mbed_cc3100 + +#endif//fPtr_func_h + + + + + + +
--- a/simplelink/cc3100.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1339 +0,0 @@ -/* -* device.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_sl_common.h" -#include "cc3100.h" - -#include "fPtr_func.h" - - -namespace mbed_cc3100 { - - uint32_t g_PingPacketsRecv; - uint32_t g_GatewayIP; - uint32_t g_StationIP; - uint32_t g_DestinationIP; - uint32_t g_BytesReceived; // variable to store the file size - uint32_t g_Status; - uint8_t g_buff[MAX_BUFF_SIZE+1]; - int32_t g_SockID; - - -cc3100::cc3100(PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi) - : _spi(cc3100_irq, cc3100_nHIB, cc3100_cs, cc3100_spi, _driver), - _driver(_nonos, _netapp, _flowcont, _spi), _nonos(_driver), _wlan(_driver, _wlan_filters), - _wlan_filters(_driver), _netapp(_driver, _nonos), _fs(_driver), _netcfg(_driver), - _socket(_driver, _nonos), _flowcont(_driver, _nonos) - - -{ - -} - -cc3100::~cc3100() -{ - -} - -/*! - \brief This function initializes the application variables - - \param[in] None - - \return 0 on success, negative error-code on error -*/ -int32_t cc3100::initializeAppVariables() -{ - - g_Status = 0; - g_PingPacketsRecv = 0; - g_StationIP = 0; - g_GatewayIP = 0; - g_DestinationIP = 0; - g_BytesReceived = 0; /* variable to store the file size */ - g_SockID = 0; - memset(g_buff, 0, sizeof(g_buff)); - - return SUCCESS; -} - -/*! - \brief Disconnecting from a WLAN Access point - - This function disconnects from the connected AP - - \param[in] None - - \return none - - \note - - \warning If the WLAN disconnection fails, we will be stuck in this function forever. -*/ -int32_t cc3100::disconnectFromAP() -{ - int32_t retVal = -1; - - /* - * The function returns 0 if 'Disconnected done', negative number if already disconnected - * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes - */ - retVal = _wlan.sl_WlanDisconnect(); - if(0 == retVal) - { - /* Wait */ - while(IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) { _nonos._SlNonOsMainLoopTask(); } - } - - return SUCCESS; -} - -/*! - \brief This function configure the SimpleLink device in its default state. It: - - Sets the mode to STATION - - Configures connection policy to Auto and AutoSmartConfig - - Deletes all the stored profiles - - Enables DHCP - - Disables Scan policy - - Sets Tx power to maximum - - Sets power policy to normal - - Unregisters mDNS services - - Remove all filters - - \param[in] none - - \return On success, zero is returned. On error, negative is returned -*/ -int32_t cc3100::configureSimpleLinkToDefaultState() -{ - SlVersionFull ver = {0}; - _WlanRxFilterOperationCommandBuff_t RxFilterIdMask = {0}; - - uint8_t val = 1; - uint8_t configOpt = 0; - uint8_t configLen = 0; - uint8_t power = 0; - - int32_t retVal = -1; - int32_t role = -1; - - role = sl_Start(0, 0, 0); - ASSERT_ON_ERROR(role); - - /* If the device is not in station-mode, try configuring it in station-mode */ - if (ROLE_STA != role) { - if (ROLE_AP == role) { - /* If the device is in AP mode, we need to wait for this event before doing anything */ - while(!IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) { - _nonos._SlNonOsMainLoopTask(); - } - } - - /* Switch to STA role and restart */ - retVal = _wlan.sl_WlanSetMode(ROLE_STA); - ASSERT_ON_ERROR(retVal); - - retVal = sl_Stop(SL_STOP_TIMEOUT); - ASSERT_ON_ERROR(retVal); - - retVal = sl_Start(0, 0, 0); - ASSERT_ON_ERROR(retVal); - - /* Check if the device is in station again */ - if (ROLE_STA != retVal) { - /* We don't want to proceed if the device is not coming up in station-mode */ - ASSERT_ON_ERROR(DEVICE_NOT_IN_STATION_MODE); - } - } - - /* Get the device's version-information */ - configOpt = SL_DEVICE_GENERAL_VERSION; - configLen = sizeof(ver); - retVal = sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION, &configOpt, &configLen, (uint8_t *)(&ver)); - ASSERT_ON_ERROR(retVal); - - /* Set connection policy to Auto + SmartConfig (Device's default connection policy) */ - retVal = _wlan.sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0); - ASSERT_ON_ERROR(retVal); - - /* Remove all profiles */ - retVal = _wlan.sl_WlanProfileDel(0xFF); - ASSERT_ON_ERROR(retVal); - - /* - * Device in station-mode. Disconnect previous connection if any - * The function returns 0 if 'Disconnected done', negative number if already disconnected - * Wait for 'disconnection' event if 0 is returned, Ignore other return-codes - */ - retVal = _wlan.sl_WlanDisconnect(); - if(0 == retVal) { - /* Wait */ - while(IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) { - _nonos._SlNonOsMainLoopTask(); - } - } - - /* Enable DHCP client*/ - retVal = _netcfg.sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE,1,1,&val); - ASSERT_ON_ERROR(retVal); - - /* Disable scan */ - configOpt = SL_SCAN_POLICY(0); - retVal = _wlan.sl_WlanPolicySet(SL_POLICY_SCAN , configOpt, NULL, 0); - ASSERT_ON_ERROR(retVal); - - /* Set Tx power level for station mode - Number between 0-15, as dB offset from maximum power - 0 will set maximum power */ - power = 0; - retVal = _wlan.sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER, 1, (uint8_t *)&power); - ASSERT_ON_ERROR(retVal); - - /* Set PM policy to normal */ - retVal = _wlan.sl_WlanPolicySet(SL_POLICY_PM , SL_NORMAL_POLICY, NULL, 0); - ASSERT_ON_ERROR(retVal); - - /* Unregister mDNS services */ - retVal = _netapp.sl_NetAppMDNSUnRegisterService(0, 0); - ASSERT_ON_ERROR(retVal); - - /* Remove all 64 filters (8*8) */ - memset(RxFilterIdMask.FilterIdMask, 0xFF, 8); - retVal = _wlan_filters.sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (uint8_t *)&RxFilterIdMask, - sizeof(_WlanRxFilterOperationCommandBuff_t)); - ASSERT_ON_ERROR(retVal); - - retVal = sl_Stop(SL_STOP_TIMEOUT); - ASSERT_ON_ERROR(retVal); - - retVal = initializeAppVariables(); - ASSERT_ON_ERROR(retVal); - - return retVal; /* Success */ -} - -/*! - \brief Create UDP socket to communicate with server. - - \param[in] none - - \return Socket descriptor for success otherwise negative - - \warning -*/ -int32_t cc3100::createUDPConnection() -{ - int32_t sd = 0; - - sd = _socket.sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, IPPROTO_UDP); - if( sd < 0 ) - { - printf("Error creating socket\n\r\n\r"); - } - - return sd; -} - -/*! - \brief Create connection with server. - - This function opens a socket and create the endpoint communication with server - - \param[in] DestinationIP - IP address of the server - - \return socket id for success and negative for error -*/ -int32_t cc3100::createConnection(uint32_t DestinationIP) -{ - SlSockAddrIn_t Addr = {0}; - int32_t Status = 0; - int32_t AddrSize = 0; - int32_t SockID = 0; - - Addr.sin_family = SL_AF_INET; - Addr.sin_port = _socket.sl_Htons(80); - Addr.sin_addr.s_addr = _socket.sl_Htonl(DestinationIP); - - AddrSize = sizeof(SlSockAddrIn_t); - - SockID = _socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); - ASSERT_ON_ERROR(SockID); - - Status = _socket.sl_Connect(SockID, ( SlSockAddr_t *)&Addr, AddrSize); - if (Status < 0) - { - _socket.sl_Close(SockID); - ASSERT_ON_ERROR(Status); - } - - return SockID; -} - -/*! - \brief Convert hex to decimal base - - \param[in] ptr - pointer to string containing number in hex - - \return number in decimal base - -*/ -int32_t cc3100::hexToi(unsigned char *ptr) -{ - uint32_t result = 0; - uint32_t len = 0; - - int32_t idx = -1; - - len = strlen((const char*) ptr); - - /* convert characters to upper case */ - for(idx = 0; ptr[idx] != '\0'; ++idx) - { - if( (ptr[idx] >= 'a') && - (ptr[idx] <= 'f') ) - { - ptr[idx] -= 32; /* Change case - ASCII 'a' = 97, 'A' = 65 => 97-65 = 32 */ - } - } - - for(idx = 0; ptr[idx] != '\0'; ++idx) - { - if(ptr[idx] >= '0' && ptr[idx] <= '9') - { - /* Converting '0' to '9' to their decimal value */ - result += (ptr[idx] - '0') * (1 << (4 * (len - 1 - idx))); - } - else if(ptr[idx] >= 'A' && ptr[idx] <= 'F') - { - /* Converting hex 'A' to 'F' to their decimal value */ - result += (ptr[idx] - 55) * (1 << (4 * (len -1 - idx))); /* .i.e. 'A' - 55 = 10, 'F' - 55 = 15 */ - } - else - { - ASSERT_ON_ERROR(INVALID_HEX_STRING); - } - } - - return result; -} - -/*! - \brief Calculate the file chunk size - - \param[in] len - pointer to length of the data in the buffer - \param[in] p_Buff - pointer to pointer of buffer containing data - \param[out] chunk_size - pointer to variable containing chunk size - - \return 0 for success, -ve for error - -*/ -int32_t cc3100::getChunkSize(int32_t *len, uint8_t **p_Buff, uint32_t *chunk_size) -{ - int32_t idx = -1; - unsigned char lenBuff[10]; - - idx = 0; - memset(lenBuff, 0, sizeof(lenBuff)); - while(*len >= 0 && **p_Buff != 13) /* check for <CR> */ - { - if(0 == *len) - { - memset(g_buff, 0, sizeof(g_buff)); - *len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0); - if(*len <= 0) - ASSERT_ON_ERROR(TCP_RECV_ERROR); - - *p_Buff = g_buff; - } - - lenBuff[idx] = **p_Buff; - idx++; - (*p_Buff)++; - (*len)--; - } - - (*p_Buff) += 2; /* skip <CR><LF> */ - (*len) -= 2; - *chunk_size = hexToi(lenBuff); - - return SUCCESS; -} - -/*! - \brief Obtain the file from the server - - This function requests the file from the server and save it on serial flash. - To request a different file for different user needs to modify the - PREFIX_BUFFER and POST_BUFFER macros. - - \param[in] None - - \return 0 for success and negative for error - -*/ -/* -int32_t cc3100::getFile() -{ - uint32_t Token = 0; - uint32_t recv_size = 0; - uint8_t *pBuff = 0; - uint8_t eof_detected = 0; - uint8_t isChunked = 0; - - int32_t transfer_len = -1; - int32_t retVal = -1; - int32_t fileHandle = -1; - - memset(g_buff, 0, sizeof(g_buff)); - - //Puts together the HTTP GET string. - strcpy((char*)g_buff, PREFIX_BUFFER); - strcat((char*)g_buff, POST_BUFFER); - - //Send the HTTP GET string to the opened TCP/IP socket. - transfer_len = _socket.sl_Send(g_SockID, g_buff, strlen((const char*)g_buff), 0); - - if (transfer_len < 0) - { - // error - printf(" Socket Send Error\r\n"); - ASSERT_ON_ERROR(TCP_SEND_ERROR); - } - - memset(g_buff, 0, sizeof(g_buff)); - - //get the reply from the server in buffer. - transfer_len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0); - - if(transfer_len <= 0) - ASSERT_ON_ERROR(TCP_RECV_ERROR); - - // Check for 404 return code - if(strstr((const char*)g_buff, HTTP_FILE_NOT_FOUND) != 0) - { - printf(" File not found, check the file and try again\r\n"); - ASSERT_ON_ERROR(FILE_NOT_FOUND_ERROR); - } - - // if not "200 OK" return error - if(strstr((const char*)g_buff, HTTP_STATUS_OK) == 0) - { - printf(" Error during downloading the file\r\n"); - ASSERT_ON_ERROR(INVALID_SERVER_RESPONSE); - } - - // check if content length is transferred with headers - pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_CONTENT_LENGTH); - if(pBuff != 0) - { - // not supported - printf(" Server response format is not supported\r\n"); - ASSERT_ON_ERROR(FORMAT_NOT_SUPPORTED); - } - - // Check if data is chunked - pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_TRANSFER_ENCODING); - if(pBuff != 0) - { - pBuff += strlen(HTTP_TRANSFER_ENCODING); - while(*pBuff == SPACE) - pBuff++; - - if(memcmp(pBuff, HTTP_ENCODING_CHUNKED, strlen(HTTP_ENCODING_CHUNKED)) == 0) - { - recv_size = 0; - isChunked = 1; - } - } - else - { - // Check if connection will be closed by after sending data - // In this method the content length is not received and end of - // connection marks the end of data - pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_CONNECTION); - if(pBuff != 0) - { - pBuff += strlen(HTTP_CONNECTION); - while(*pBuff == SPACE) - pBuff++; - - if(memcmp(pBuff, HTTP_ENCODING_CHUNKED, strlen(HTTP_CONNECTION_CLOSE)) == 0) - { - // not supported - printf(" Server response format is not supported\r\n"); - ASSERT_ON_ERROR(FORMAT_NOT_SUPPORTED); - } - } - } - - // "\r\n\r\n" marks the end of headers - pBuff = (uint8_t *)strstr((const char*)g_buff, HTTP_END_OF_HEADER); - if(pBuff == 0) - { - printf(" Invalid response\r\n"); - ASSERT_ON_ERROR(INVALID_SERVER_RESPONSE); - } - // Increment by 4 to skip "\r\n\r\n" - pBuff += 4; - - // Adjust buffer data length for header size - transfer_len -= (pBuff - g_buff); - - // If data in chunked format, calculate the chunk size - if(isChunked == 1) - { - retVal = getChunkSize(&transfer_len, &pBuff, &recv_size); - if(retVal < 0) - { - // Error - printf(" Problem with connection to server\r\n"); - return retVal; - } - } - - // Open file to save the downloaded file - retVal = _fs.sl_FsOpen((uint8_t *)FILE_NAME, - FS_MODE_OPEN_WRITE, &Token, &fileHandle); - if(retVal < 0) - { - // File Doesn't exit create a new of 45 KB file - retVal = _fs.sl_FsOpen((uint8_t *)FILE_NAME, - _fs.FS_MODE_OPEN_CREATE(SIZE_45K,_FS_FILE_OPEN_FLAG_COMMIT|_FS_FILE_PUBLIC_WRITE), - &Token, &fileHandle); - if(retVal < 0) - { - printf(" Error during opening the file\r\n"); - return retVal; - } - } - - while (0 < transfer_len) - { - // For chunked data recv_size contains the chunk size to be received - // while the transfer_len contains the data in the buffer - if(recv_size <= transfer_len) - { - // write the recv_size - retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived, - (uint8_t *)pBuff, recv_size); - if(retVal < recv_size) - { - // Close file without saving - retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1); - printf(" Error during writing the file\r\n"); - return FILE_WRITE_ERROR; - } - transfer_len -= recv_size; - g_BytesReceived +=recv_size; - pBuff += recv_size; - recv_size = 0; - - if(isChunked == 1) - { - // if data in chunked format calculate next chunk size - pBuff += 2; // 2 bytes for <CR> <LF> - transfer_len -= 2; - - if(getChunkSize(&transfer_len, &pBuff, &recv_size) < 0) - { - // Error - break; - } - - // if next chunk size is zero we have received the complete file - if(recv_size == 0) - { - eof_detected = 1; - break; - } - - if(recv_size < transfer_len) - { - // Code will enter this section if the new chunk size is less then - // then the transfer size. This will the last chunk of file received - - retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived, - (uint8_t *)pBuff, recv_size); - if(retVal < recv_size) - { - // Close file without saving - retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1); - printf(" Error during writing the file\r\n"); - return FILE_WRITE_ERROR; - } - transfer_len -= recv_size; - g_BytesReceived +=recv_size; - pBuff += recv_size; - recv_size = 0; - - pBuff += 2; // 2bytes for <CR> <LF> - transfer_len -= 2; - - // Calculate the next chunk size, should be zero - if(getChunkSize(&transfer_len, &pBuff, &recv_size) < 0) - { - // Error - break; - } - - // if next chunk size is non zero error - if(recv_size != 0) - { - // Error - break; - } - eof_detected = 1; - break; - } - else - { - // write data on the file - retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived, - (uint8_t *)pBuff, transfer_len); - if(retVal < transfer_len) - { - // Close file without saving - retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1); - printf(" Error during writing the file\r\n"); - ASSERT_ON_ERROR(FILE_WRITE_ERROR); - } - recv_size -= transfer_len; - g_BytesReceived +=transfer_len; - } - } - // complete file received exit - if(recv_size == 0) - { - eof_detected = 1; - break; - } - } - else - { - // write data on the file - retVal = _fs.sl_FsWrite(fileHandle, g_BytesReceived, - (uint8_t *)pBuff, transfer_len); - if (retVal < 0) - { - // Close file without saving - retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1); - printf(" Error during writing the file\r\n"); - ASSERT_ON_ERROR(FILE_WRITE_ERROR); - } - g_BytesReceived +=transfer_len; - recv_size -= transfer_len; - } - - memset(g_buff, 0, sizeof(g_buff)); - - transfer_len = _socket.sl_Recv(g_SockID, &g_buff[0], MAX_BUFF_SIZE, 0); - if(transfer_len <= 0) - ASSERT_ON_ERROR(TCP_RECV_ERROR); - - pBuff = g_buff; - } - - // If user file has checksum which can be used to verify the temporary - // file then file should be verified - // In case of invalid file (FILE_NAME) should be closed without saving to - // recover the previous version of file - if(0 > transfer_len || eof_detected == 0) - { - // Close file without saving - retVal = _fs.sl_FsClose(fileHandle, 0, (unsigned char*)"A", 1); - printf(" Error While File Download\r\n"); - ASSERT_ON_ERROR(INVALID_FILE); - } - else - { - // Save and close file - retVal = _fs.sl_FsClose(fileHandle, 0, 0, 0); - ASSERT_ON_ERROR(retVal); - } - - return SUCCESS;; -} -*/ - -/*! - \brief Connecting to a WLAN Access point - - This function connects to the required AP (SSID_NAME). - The function will return once we are connected and have acquired IP address - - \param[in] None - - \return 0 on success, negative error-code on error - - \note - - \warning If the WLAN connection fails or we don't acquire an IP address, - We will be stuck in this function forever. -*/ -int32_t cc3100::establishConnectionWithAP() -{ - - SlSecParams_t secParams = {0}; - int32_t retVal = 0; - - secParams.Key = (signed char *)PASSKEY; - secParams.KeyLen = strlen(PASSKEY); - secParams.Type = SEC_TYPE; - - retVal = _wlan.sl_WlanConnect((signed char *)SSID_NAME, strlen(SSID_NAME), 0, &secParams, 0); - ASSERT_ON_ERROR(retVal); - - /* Wait */ - while((!IS_CONNECTED(g_Status,STATUS_BIT_CONNECTION)) || (!IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED))) { _nonos._SlNonOsMainLoopTask(); } - return SUCCESS; -} - -/*! - \brief This function checks the LAN connection by pinging the AP's gateway - - \param[in] None - - \return 0 on success, negative error-code on error -*/ -int32_t cc3100::checkLanConnection() -{ - SlPingStartCommand_t pingParams = {0}; - SlPingReport_t pingReport = {0}; - - int32_t retVal = -1; - - CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE); - g_PingPacketsRecv = 0; - - /* Set the ping parameters */ - pingParams.PingIntervalTime = PING_INTERVAL; - pingParams.PingSize = PING_PKT_SIZE; - pingParams.PingRequestTimeout = PING_TIMEOUT; - pingParams.TotalNumberOfAttempts = PING_ATTEMPTS; - pingParams.Flags = 0; - pingParams.Ip = g_GatewayIP; - - /* Check for LAN connection */ - retVal = _netapp.sl_NetAppPingStart( (SlPingStartCommand_t*)&pingParams, SL_AF_INET, - (SlPingReport_t*)&pingReport, SimpleLinkPingReport); - ASSERT_ON_ERROR(retVal); - - /* Wait */ - while(!IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { _nonos._SlNonOsMainLoopTask(); } - - if(0 == g_PingPacketsRecv) - { - /* Problem with LAN connection */ - ASSERT_ON_ERROR(LAN_CONNECTION_FAILED); - } - - /* LAN connection is successful */ - return SUCCESS; -} - -/*! - \brief This function checks the internet connection by pinging - the external-host (HOST_NAME) - - \param[in] None - - \return 0 on success, negative error-code on error -*/ -int32_t cc3100::checkInternetConnection() -{ - SlPingStartCommand_t pingParams = {0}; - SlPingReport_t pingReport = {0}; - - uint32_t ipAddr = 0; - - int32_t retVal = -1; - - CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE); - g_PingPacketsRecv = 0; - - /* Set the ping parameters */ - pingParams.PingIntervalTime = PING_INTERVAL; - pingParams.PingSize = PING_PKT_SIZE; - pingParams.PingRequestTimeout = PING_TIMEOUT; - pingParams.TotalNumberOfAttempts = PING_ATTEMPTS; - pingParams.Flags = 0; - pingParams.Ip = g_GatewayIP; - - /* Check for Internet connection */ - retVal = _netapp.sl_NetAppDnsGetHostByName((unsigned char *)HOST_NAME, strlen(HOST_NAME), &ipAddr, SL_AF_INET); - ASSERT_ON_ERROR(retVal); - - /* Replace the ping address to match HOST_NAME's IP address */ - pingParams.Ip = ipAddr; - - /* Try to ping HOST_NAME */ - retVal = _netapp.sl_NetAppPingStart( (SlPingStartCommand_t*)&pingParams, SL_AF_INET, - (SlPingReport_t*)&pingReport, SimpleLinkPingReport); - ASSERT_ON_ERROR(retVal); - - /* Wait */ - while(!IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { _nonos._SlNonOsMainLoopTask(); } - - if (0 == g_PingPacketsRecv) - { - /* Problem with internet connection*/ - ASSERT_ON_ERROR(INTERNET_CONNECTION_FAILED); - } - - /* Internet connection is successful */ - return SUCCESS; -} - -/*****************************************************************************/ -/* Internal functions */ -/*****************************************************************************/ - -int16_t cc3100::_sl_GetStartResponseConvert(uint32_t Status) -{ - - switch(Status) { - case INIT_STA_OK: - return ROLE_STA; - case INIT_STA_ERR: - return ROLE_STA_ERR; - case INIT_AP_OK: - return ROLE_AP; - case INIT_AP_ERR: - return ROLE_AP_ERR; - case INIT_P2P_OK: - return ROLE_P2P; - case INIT_P2P_ERR: - return ROLE_P2P_ERR; - default: - return (int16_t)Status; - } -} - -/*****************************************************************************/ -/* API Functions */ -/*****************************************************************************/ - -bool cc3100::IS_PING_DONE(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_CONNECTED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_STA_CONNECTED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_IP_ACQUIRED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_IP_LEASED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_CONNECTION_FAILED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_P2P_NEG_REQ_RECEIVED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_SMARTCONFIG_DONE(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -bool cc3100::IS_SMARTCONFIG_STOPPED(uint32_t status_variable,const uint32_t bit){ - - g_Status = status_variable; - - if(0 != (g_Status & ((uint32_t)1L<<(bit)))){ - return TRUE; - }else{ - return FALSE; - } -} - -void cc3100::CLR_STATUS_BIT(uint32_t status_variable, const uint32_t bit){ - - g_Status = status_variable; - g_Status &= ~((uint32_t)1L<<(bit)); - -} - -void cc3100::SET_STATUS_BIT(uint32_t status_variable, const uint32_t bit){ - - g_Status = status_variable; - g_Status |= ((uint32_t)1L<<(bit)); - -} - -/*****************************************************************************/ -/* sl_Task */ -/*****************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_Task) -void cc3100::sl_Task(void) -{ -#ifdef _SlTaskEntry - _nonos._SlNonOsMainLoopTask; - -#endif -} -#endif - -/*****************************************************************************/ -/* sl_Start */ -/*****************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_Start) -int16_t cc3100::sl_Start(const void* pIfHdl, int8_t* pDevName, const P_INIT_CALLBACK pInitCallBack) -{ - int16_t ObjIdx = MAX_CONCURRENT_ACTIONS; - InitComplete_t AsyncRsp; - - /* Perform any preprocessing before enable networking services */ - sl_DeviceEnablePreamble();//stub only - - /* ControlBlock init */ - _driver._SlDrvDriverCBInit(); - - /* open the interface: usually SPI or UART */ - if (NULL == pIfHdl) - { - g_pCB->FD = _spi.spi_Open((int8_t *)pDevName, 0); - } - else - { - g_pCB->FD = (_SlFd_t)pIfHdl; - } - /* Use Obj to issue the command, if not available try later */ - ObjIdx = _driver._SlDrvWaitForPoolObj(START_STOP_ID,SL_MAX_SOCKETS); - if (MAX_CONCURRENT_ACTIONS == ObjIdx) - { - printf("SL_POOL_IS_EMPTY\r\n"); - return SL_POOL_IS_EMPTY; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - if( g_pCB->FD >= 0) { - _spi.CC3100_disable(); - - if(NULL != pInitCallBack) { - g_pCB->pInitCallback = pInitCallBack; - } - _spi.CC3100_enable(); - - if (NULL == pInitCallBack) { - - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - /*release Pool Object*/ - _driver._SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex); - return _sl_GetStartResponseConvert(AsyncRsp.Status); - } - } - - return (int16_t)g_pCB->FD; - -} -#endif - -/*************************************************************************** -_sl_HandleAsync_InitComplete - handles init complete signalling to -a waiting object -****************************************************************************/ -void cc3100::_sl_HandleAsync_InitComplete(void *pVoidBuf) -{ - - InitComplete_t *pMsgArgs = (InitComplete_t *)_SL_RESP_ARGS_START(pVoidBuf); - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - if(g_pCB->pInitCallback) { - g_pCB->pInitCallback(_sl_GetStartResponseConvert(pMsgArgs->Status)); - } else { - memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(InitComplete_t)); - OSI_RET_OK_CHECK(_nonos.sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - if(g_pCB->pInitCallback) { - _driver._SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex); - } - -} - -/***************************************************************************** -sl_stop -******************************************************************************/ -typedef union { - _DevStopCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlStopMsg_u; - -const _SlCmdCtrl_t _SlStopCmdCtrl = { - SL_OPCODE_DEVICE_STOP_COMMAND, - sizeof(_DevStopCommand_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_Stop) -int16_t cc3100::sl_Stop(uint16_t timeout) -{ - int16_t RetVal=0; - _SlStopMsg_u Msg; - _BasicResponse_t AsyncRsp; - int16_t ObjIdx = MAX_CONCURRENT_ACTIONS; - /* if timeout is 0 the shutdown is forced immediately */ - if( 0 == timeout ) { - _spi.registerInterruptHandler(NULL, NULL); - _spi.CC3100_disable(); - RetVal = _spi.spi_Close(g_pCB->FD); - - } else { - /* let the device make the shutdown using the defined timeout */ - Msg.Cmd.Timeout = timeout; - /* Use Obj to issue the command, if not available try later */ - ObjIdx = _driver._SlDrvWaitForPoolObj(START_STOP_ID,SL_MAX_SOCKETS); - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlStopCmdCtrl, &Msg, NULL)); - - if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - Msg.Rsp.status = AsyncRsp.status; - RetVal = Msg.Rsp.status; - } - - _driver._SlDrvReleasePoolObj((uint8_t)ObjIdx); - - _spi.registerInterruptHandler(NULL, NULL); - _spi.CC3100_disable(); - _spi.spi_Close(g_pCB->FD); - } - _driver._SlDrvDriverCBDeinit(); - - return RetVal; -} -#endif - - -/***************************************************************************** -sl_EventMaskSet -*****************************************************************************/ -typedef union { - _DevMaskEventSetCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlEventMaskSetMsg_u; - -const _SlCmdCtrl_t _SlEventMaskSetCmdCtrl = { - SL_OPCODE_DEVICE_EVENTMASKSET, - sizeof(_DevMaskEventSetCommand_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_EventMaskSet) -int16_t cc3100::sl_EventMaskSet(uint8_t EventClass , uint32_t Mask) -{ - _SlEventMaskSetMsg_u Msg; - Msg.Cmd.group = EventClass; - Msg.Cmd.mask = Mask; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskSetCmdCtrl, &Msg, NULL)); - - return (int16_t)Msg.Rsp.status; -} -#endif - -/****************************************************************************** -sl_EventMaskGet -******************************************************************************/ -typedef union { - _DevMaskEventGetCommand_t Cmd; - _DevMaskEventGetResponse_t Rsp; -} _SlEventMaskGetMsg_u; - -const _SlCmdCtrl_t _SlEventMaskGetCmdCtrl = { - SL_OPCODE_DEVICE_EVENTMASKGET, - sizeof(_DevMaskEventGetCommand_t), - sizeof(_DevMaskEventGetResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_EventMaskGet) -int16_t cc3100::sl_EventMaskGet(uint8_t EventClass, uint32_t *pMask) -{ - _SlEventMaskGetMsg_u Msg; - - Msg.Cmd.group = EventClass; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskGetCmdCtrl, &Msg, NULL)); - - *pMask = Msg.Rsp.mask; - return SL_RET_CODE_OK; -} -#endif - - - -/****************************************************************************** -sl_DevGet -******************************************************************************/ - -typedef union { - _DeviceSetGet_t Cmd; - _DeviceSetGet_t Rsp; -} _SlDeviceMsgGet_u; - -const _SlCmdCtrl_t _SlDeviceGetCmdCtrl = { - SL_OPCODE_DEVICE_DEVICEGET, - sizeof(_DeviceSetGet_t), - sizeof(_DeviceSetGet_t) -}; - -#if _SL_INCLUDE_FUNC(sl_DevGet) -int32_t cc3100::sl_DevGet(uint8_t DeviceGetId, uint8_t *pOption,uint8_t *pConfigLen, uint8_t *pValues) -{ - _SlDeviceMsgGet_u Msg; - _SlCmdExt_t CmdExt; - - if (*pConfigLen == 0) { - return SL_EZEROLEN; - } - - if( pOption ) { - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = *pConfigLen; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t *)pValues; - CmdExt.ActualRxPayloadLen = 0; - - Msg.Cmd.DeviceSetId = DeviceGetId; - - Msg.Cmd.Option = (uint16_t)*pOption; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceGetCmdCtrl, &Msg, &CmdExt)); - - if( pOption ) { - *pOption = (uint8_t)Msg.Rsp.Option; - } - - 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; - } else { - return -1; - } -} -#endif - -/****************************************************************************** -sl_DevSet -******************************************************************************/ -typedef union { - _DeviceSetGet_t Cmd; - _BasicResponse_t Rsp; -} _SlDeviceMsgSet_u; - -const _SlCmdCtrl_t _SlDeviceSetCmdCtrl = { - SL_OPCODE_DEVICE_DEVICESET, - sizeof(_DeviceSetGet_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_DevSet) -int32_t cc3100::sl_DevSet(uint8_t DeviceSetId ,uint8_t Option,uint8_t ConfigLen, uint8_t *pValues) -{ - _SlDeviceMsgSet_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (ConfigLen+3) & (~3); - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)pValues; - CmdExt.pRxPayload = NULL; - - - Msg.Cmd.DeviceSetId = DeviceSetId; - Msg.Cmd.ConfigLen = ConfigLen; - Msg.Cmd.Option = Option; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceSetCmdCtrl, &Msg, &CmdExt)); - - return (int16_t)Msg.Rsp.status; -} -#endif - -/****************************************************************************** -sl_UartSetMode -******************************************************************************/ -#ifdef SL_IF_TYPE_UART -typedef union { - _DevUartSetModeCommand_t Cmd; - _DevUartSetModeResponse_t Rsp; -} _SlUartSetModeMsg_u; - -const _SlCmdCtrl_t _SlUartSetModeCmdCtrl = { - SL_OPCODE_DEVICE_SETUARTMODECOMMAND, - sizeof(_DevUartSetModeCommand_t), - sizeof(_DevUartSetModeResponse_t) -}; - - -#if _SL_INCLUDE_FUNC(sl_UartSetMode) -int16_t cc3100::sl_UartSetMode(const SlUartIfParams_t* pUartParams) -{ - _SlUartSetModeMsg_u Msg; - uint32_t magicCode = 0xFFFFFFFF; - - Msg.Cmd.BaudRate = pUartParams->BaudRate; - Msg.Cmd.FlowControlEnable = pUartParams->FlowControlEnable; - - - VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlUartSetModeCmdCtrl, &Msg, NULL)); - - /* cmd response OK, we can continue with the handshake */ - if (SL_RET_CODE_OK == Msg.Rsp.status) { - sl_IfMaskIntHdlr(); - - /* Close the comm port */ - sl_IfClose(g_pCB->FD); - - /* Re-open the comm port */ - sl_IfOpen((void * )pUartParams, UART_IF_OPEN_FLAG_RE_OPEN); - sl_IfUnMaskIntHdlr(); - - /* send the magic code and wait for the response */ - sl_IfWrite(g_pCB->FD, (uint8_t* )&magicCode, 4); - - magicCode = UART_SET_MODE_MAGIC_CODE; - sl_IfWrite(g_pCB->FD, (uint8_t* )&magicCode, 4); - - /* clear magic code */ - magicCode = 0; - - /* wait (blocking) till the magic code to be returned from device */ - sl_IfRead(g_pCB->FD, (uint8_t* )&magicCode, 4); - - /* check for the received magic code matching */ - if (UART_SET_MODE_MAGIC_CODE != magicCode) { - _SL_ASSERT(0); - } - } - - return (int16_t)Msg.Rsp.status; -} -#endif -#endif - -}//namespace - -
--- a/simplelink/cc3100.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,809 +0,0 @@ -/* - * device.h - 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. - * -*/ - -#ifndef DEVICE_H_ -#define DEVICE_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ -#include "mbed.h" -#include "cc3100_simplelink.h" -#include "cc3100_driver.h" -#include "cc3100_wlan_rx_filters.h" - -#include "cc3100_spi.h" -#include "cc3100_netcfg.h" - -namespace mbed_cc3100 { - -/*! - - \addtogroup device - @{ - -*/ - const uint16_t MAX_BUFF_SIZE = 1460; - extern uint32_t g_PingPacketsRecv; - extern uint32_t g_GatewayIP; - extern uint32_t g_StationIP; - extern uint32_t g_DestinationIP; - extern uint32_t g_BytesReceived; // variable to store the file size - extern uint32_t g_Status; - extern uint8_t g_buff[MAX_BUFF_SIZE+1]; - extern int32_t g_SockID; - - -/* File on the serial flash */ -#define FILE_NAME "cc3000_module.pdf" -#define HOST_NAME "www.ti.com" - -#define HTTP_FILE_NOT_FOUND "404 Not Found" /* HTTP file not found response */ -#define HTTP_STATUS_OK "200 OK" /* HTTP status ok response */ -#define HTTP_CONTENT_LENGTH "Content-Length:" /* HTTP content length header */ -#define HTTP_TRANSFER_ENCODING "Transfer-Encoding:" /* HTTP transfer encoding header */ -#define HTTP_ENCODING_CHUNKED "chunked" /* HTTP transfer encoding header value */ -#define HTTP_CONNECTION "Connection:" /* HTTP Connection header */ -#define HTTP_CONNECTION_CLOSE "close" /* HTTP Connection header value */ -#define HTTP_END_OF_HEADER "\r\n\r\n" /* string marking the end of headers in response */ - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -const uint16_t IP_LEASE_TIME = 3600; - -const uint16_t SIZE_45K = 46080; /* Serial flash file size 45 KB */ -const uint16_t READ_SIZE = 1450; -const uint8_t SPACE = 32; - -const uint16_t PING_INTERVAL = 1000; -const uint8_t PING_SIZE = 20; -const uint16_t PING_TIMEOUT = 3000; -const uint8_t PING_ATTEMPTS = 3; -const uint8_t PING_PKT_SIZE = 20; - -const uint8_t SL_STOP_TIMEOUT = 0xFF; - -/* SL internal Error codes */ - -/* Receive this error in case there are no resources to issue the command - If possible, increase the number of MAX_CUNCURENT_ACTIONS (result in memory increase) - If not, try again later */ -const int16_t SL_POOL_IS_EMPTY = (-2000); - -/* Receive this error in case a given length for RX buffer was too small. - Receive payload was bigger than the given buffer size. Therefore, payload is cut according to receive size - Recommend to increase buffer size */ -const int16_t SL_ESMALLBUF = (-2001); - -/* Receive this error in case zero length is supplied to a "get" API - Recommend to supply length according to requested information (view options defines for help) */ -const int16_t SL_EZEROLEN = (-2002); - -/* User supplied invalid parameter */ -const int16_t SL_INVALPARAM = (-2003); - -/* End of SL internal Error codes */ - -/*****************************************************************************/ -/* Errors returned from the general error async event */ -/*****************************************************************************/ - -/* Use bit 32: Lower bits of status variable are used for NWP events - * 1 in a 'status_variable', the device has completed the ping operation - * 0 in a 'status_variable', the device has not completed the ping operation - */ -//const uint32_t STATUS_BIT_PING_DONE = 31; - -/* Status bits - These are used to set/reset the corresponding bits in a 'status_variable' */ -typedef enum { - STATUS_BIT_CONNECTION = 0, /* If this bit is: - * 1 in a 'status_variable', the device is connected to the AP - * 0 in a 'status_variable', the device is not connected to the AP - */ - - STATUS_BIT_STA_CONNECTED, /* If this bit is: - * 1 in a 'status_variable', client is connected to device - * 0 in a 'status_variable', client is not connected to device - */ - - STATUS_BIT_IP_ACQUIRED, /* If this bit is: - * 1 in a 'status_variable', the device has acquired an IP - * 0 in a 'status_variable', the device has not acquired an IP - */ - - STATUS_BIT_IP_LEASED, /* If this bit is: - * 1 in a 'status_variable', the device has leased an IP - * 0 in a 'status_variable', the device has not leased an IP - */ - - STATUS_BIT_CONNECTION_FAILED, /* If this bit is: - * 1 in a 'status_variable', failed to connect to device - * 0 in a 'status_variable' - */ - - STATUS_BIT_P2P_NEG_REQ_RECEIVED,/* If this bit is: - * 1 in a 'status_variable', connection requested by remote wifi-direct device - * 0 in a 'status_variable', - */ - STATUS_BIT_SMARTCONFIG_DONE, /* If this bit is: - * 1 in a 'status_variable', smartconfig completed - * 0 in a 'status_variable', smartconfig event couldn't complete - */ - - STATUS_BIT_SMARTCONFIG_STOPPED, /* If this bit is: - * 1 in a 'status_variable', smartconfig process stopped - * 0 in a 'status_variable', smartconfig process running - */ - - STATUS_BIT_PING_DONE = 31 - /* Use bit 32: Lower bits of status variable are used for NWP events - * 1 in a 'status_variable', the device has completed the ping operation - * 0 in a 'status_variable', the device has not completed the ping operation - */ - -} e_StatusBits; - -/* Application specific status/error codes */ -typedef enum { - LAN_CONNECTION_FAILED = -0x7D0, /* Choosing this number to avoid overlap with host-driver's error codes */ - INTERNET_CONNECTION_FAILED = LAN_CONNECTION_FAILED - 1, - DEVICE_NOT_IN_STATION_MODE = INTERNET_CONNECTION_FAILED - 1, - HTTP_SEND_ERROR = DEVICE_NOT_IN_STATION_MODE - 1, - HTTP_RECV_ERROR = HTTP_SEND_ERROR - 1, - HTTP_INVALID_RESPONSE = HTTP_RECV_ERROR -1, - SNTP_SEND_ERROR = DEVICE_NOT_IN_STATION_MODE - 1, - SNTP_RECV_ERROR = SNTP_SEND_ERROR - 1, - SNTP_SERVER_RESPONSE_ERROR = SNTP_RECV_ERROR - 1, - INVALID_HEX_STRING = DEVICE_NOT_IN_STATION_MODE - 1, - TCP_RECV_ERROR = INVALID_HEX_STRING - 1, - TCP_SEND_ERROR = TCP_RECV_ERROR - 1, - FILE_NOT_FOUND_ERROR = TCP_SEND_ERROR - 1, - INVALID_SERVER_RESPONSE = FILE_NOT_FOUND_ERROR - 1, - FORMAT_NOT_SUPPORTED = INVALID_SERVER_RESPONSE - 1, - FILE_WRITE_ERROR = FORMAT_NOT_SUPPORTED - 1, - INVALID_FILE = FILE_WRITE_ERROR - 1, - - STATUS_CODE_MAX = -0xBB8 -} e_AppStatusCodes; - - /* Send types */ -typedef enum { - SL_ERR_SENDER_HEALTH_MON, - SL_ERR_SENDER_CLI_UART, - SL_ERR_SENDER_SUPPLICANT, - SL_ERR_SENDER_NETWORK_STACK, - SL_ERR_SENDER_WLAN_DRV_IF, - SL_ERR_SENDER_WILINK, - SL_ERR_SENDER_INIT_APP, - SL_ERR_SENDER_NETX, - SL_ERR_SENDER_HOST_APD, - SL_ERR_SENDER_MDNS, - SL_ERR_SENDER_HTTP_SERVER, - SL_ERR_SENDER_DHCP_SERVER, - SL_ERR_SENDER_DHCP_CLIENT, - SL_ERR_DISPATCHER, - SL_ERR_NUM_SENDER_LAST=0xFF -} SlErrorSender_e; - -/* Error codes */ -const int8_t SL_ERROR_STATIC_ADDR_SUBNET_ERROR = (-60); /* network stack error*/ -const int8_t SL_ERROR_ILLEGAL_CHANNEL = (-61); /* supplicant error */ -const int8_t SL_ERROR_SUPPLICANT_ERROR = (-72); /* init error code */ -const int8_t SL_ERROR_HOSTAPD_INIT_FAIL = (-73); /* init error code */ -const int8_t SL_ERROR_HOSTAPD_INIT_IF_FAIL = (-74); /* init error code */ -const int8_t SL_ERROR_WLAN_DRV_INIT_FAIL = (-75); /* init error code */ -const int8_t SL_ERROR_WLAN_DRV_START_FAIL = (-76); /* wlan start error */ -const int8_t SL_ERROR_FS_FILE_TABLE_LOAD_FAILED = (-77); /* init file system failed */ -const int8_t SL_ERROR_PREFERRED_NETWORKS_FILE_LOAD_FAILED = (-78); /* init file system failed */ -const int8_t SL_ERROR_HOSTAPD_BSSID_VALIDATION_ERROR = (-79); /* Ap configurations BSSID error */ -const int8_t SL_ERROR_HOSTAPD_FAILED_TO_SETUP_INTERFACE = (-80); /* Ap configurations interface error */ -const int8_t SL_ERROR_MDNS_ENABLE_FAIL = (-81); /* mDNS enable failed */ -const int8_t SL_ERROR_HTTP_SERVER_ENABLE_FAILED = (-82); /* HTTP server enable failed */ -const int8_t SL_ERROR_DHCP_SERVER_ENABLE_FAILED = (-83); /* DHCP server enable failed */ -const int8_t SL_ERROR_PREFERRED_NETWORK_LIST_FULL = (-93); /* supplicant error */ -const int8_t SL_ERROR_PREFERRED_NETWORKS_FILE_WRITE_FAILED = (-94); /* supplicant error */ -const int8_t SL_ERROR_DHCP_CLIENT_RENEW_FAILED = (-100); /* DHCP client error */ -/* WLAN Connection management status */ -const int8_t SL_ERROR_CON_MGMT_STATUS_UNSPECIFIED = (-102); -const int8_t SL_ERROR_CON_MGMT_STATUS_AUTH_REJECT = (-103); -const int8_t SL_ERROR_CON_MGMT_STATUS_ASSOC_REJECT = (-104); -const int8_t SL_ERROR_CON_MGMT_STATUS_SECURITY_FAILURE = (-105); -const int8_t SL_ERROR_CON_MGMT_STATUS_AP_DEAUTHENTICATE = (-106); -const int8_t SL_ERROR_CON_MGMT_STATUS_AP_DISASSOCIATE = (-107); -const int8_t SL_ERROR_CON_MGMT_STATUS_ROAMING_TRIGGER = (-108); -const int8_t SL_ERROR_CON_MGMT_STATUS_DISCONNECT_DURING_CONNECT = (-109); -const int8_t SL_ERROR_CON_MGMT_STATUS_SG_RESELECT = (-110); -const int8_t SL_ERROR_CON_MGMT_STATUS_ROC_FAILURE = (-111); -const int8_t SL_ERROR_CON_MGMT_STATUS_MIC_FAILURE = (-112); -/* end of WLAN connection management error statuses */ -const int8_t SL_ERROR_WAKELOCK_ERROR_PREFIX = (-115); /* Wake lock expired */ -const int8_t SL_ERROR_LENGTH_ERROR_PREFIX = (-116); /* Uart header length error */ -const int8_t SL_ERROR_MDNS_CREATE_FAIL = (-121); /* mDNS create failed */ -const int8_t SL_ERROR_GENERAL_ERROR = (-127); - - - -const int8_t SL_DEVICE_GENERAL_CONFIGURATION = (1); -const int8_t SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME = (11); -const int8_t SL_DEVICE_GENERAL_VERSION = (12); -const int8_t SL_DEVICE_STATUS = (2); - -/* - Declare the different event group classifications - The SimpleLink device send asynchronous events. Each event has a group - classification according to its nature. -*/ -/* SL_EVENT_CLASS_WLAN connection user events */ -const int8_t SL_WLAN_CONNECT_EVENT = (1); -const int8_t SL_WLAN_DISCONNECT_EVENT = (2); -/* WLAN Smart Config user events */ -const int8_t SL_WLAN_SMART_CONFIG_COMPLETE_EVENT = (3); -const int8_t SL_WLAN_SMART_CONFIG_STOP_EVENT = (4); -/* WLAN AP user events */ -const int8_t SL_WLAN_STA_CONNECTED_EVENT = (5); -const int8_t SL_WLAN_STA_DISCONNECTED_EVENT = (6); -/* WLAN P2P user events */ -const int8_t SL_WLAN_P2P_DEV_FOUND_EVENT = (7); -const int8_t SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT = (8); -const int8_t SL_WLAN_CONNECTION_FAILED_EVENT = (9); -/* SL_EVENT_CLASS_DEVICE user events */ -const int8_t SL_DEVICE_FATAL_ERROR_EVENT = (1); -/* SL_EVENT_CLASS_BSD user events */ -const int8_t SL_SOCKET_TX_FAILED_EVENT = (1); -const int8_t SL_SOCKET_ASYNC_EVENT = (2); -/* SL_EVENT_CLASS_NETAPP user events */ -const int8_t SL_NETAPP_IPV4_IPACQUIRED_EVENT = (1); -const int8_t SL_NETAPP_IPV6_IPACQUIRED_EVENT = (2); -const int8_t SL_NETAPP_IP_LEASED_EVENT = (3); -const int8_t SL_NETAPP_IP_RELEASED_EVENT = (4); - -/* Server Events */ -const int8_t SL_NETAPP_HTTPGETTOKENVALUE_EVENT = (1); -const int8_t SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT = (2); - - -/* - Declare the different event group classifications for sl_DevGet - for getting status indications - */ - -/* Events list to mask/unmask*/ -const int8_t SL_EVENT_CLASS_GLOBAL = (0); -const int8_t SL_EVENT_CLASS_DEVICE = (1); -const int8_t SL_EVENT_CLASS_WLAN = (2); -const int8_t SL_EVENT_CLASS_BSD = (3); -const int8_t SL_EVENT_CLASS_NETAPP = (4); -const int8_t SL_EVENT_CLASS_NETCFG = (5); -const int8_t SL_EVENT_CLASS_FS = (6); - - -/****************** DEVICE CLASS status ****************/ -const uint32_t EVENT_DROPPED_DEVICE_ASYNC_GENERAL_ERROR = (0x00000001L); -const uint32_t STATUS_DEVICE_SMART_CONFIG_ACTIVE = (0x80000000L); - -/****************** WLAN CLASS status ****************/ -const uint32_t EVENT_DROPPED_WLAN_WLANASYNCONNECTEDRESPONSE = (0x00000001L); -const uint32_t EVENT_DROPPED_WLAN_WLANASYNCDISCONNECTEDRESPONSE = (0x00000002L); -const uint32_t EVENT_DROPPED_WLAN_STA_CONNECTED = (0x00000004L); -const uint32_t EVENT_DROPPED_WLAN_STA_DISCONNECTED = (0x00000008L); -const uint32_t STATUS_WLAN_STA_CONNECTED = (0x80000000L); - -/****************** NETAPP CLASS status ****************/ -const uint32_t EVENT_DROPPED_NETAPP_IPACQUIRED = (0x00000001L); -const uint32_t EVENT_DROPPED_NETAPP_IPACQUIRED_V6 = (0x00000002L); -const uint32_t EVENT_DROPPED_NETAPP_IP_LEASED = (0x00000004L); -const uint32_t EVENT_DROPPED_NETAPP_IP_RELEASED = (0x00000008L); - -/****************** BSD CLASS status ****************/ -const uint32_t EVENT_DROPPED_SOCKET_TXFAILEDASYNCRESPONSE = (0x00000001L); - -/****************** FS CLASS ****************/ - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ - -#ifdef SL_IF_TYPE_UART -typedef struct { - uint32_t BaudRate; - uint8_t FlowControlEnable; - uint8_t CommPort; -} SlUartIfParams_t; -#endif - -typedef struct { - uint32_t ChipId; - uint32_t FwVersion[4]; - uint8_t PhyVersion[4]; -} _SlPartialVersion; - -typedef struct { - _SlPartialVersion ChipFwAndPhyVersion; - uint32_t NwpVersion[4]; - uint16_t RomVersion; - uint16_t Padding; -} SlVersionFull; - -typedef struct { - int8_t status; - SlErrorSender_e sender; -} sl_DeviceReport; - -typedef union { - sl_DeviceReport deviceEvent; -} _SlDeviceEventData_u; - -typedef struct { - uint32_t Event; - _SlDeviceEventData_u EventData; -} SlDeviceEvent_t; - -typedef struct { - /* time */ - uint32_t sl_tm_sec; - uint32_t sl_tm_min; - uint32_t sl_tm_hour; - /* date */ - uint32_t sl_tm_day; /* 1-31 */ - uint32_t sl_tm_mon; /* 1-12 */ - uint32_t sl_tm_year; /* YYYY 4 digits */ - uint32_t sl_tm_week_day; /* not required */ - uint32_t sl_tm_year_day; /* not required */ - uint32_t reserved[3]; -} SlDateTime_t; - -/******************************************************************************/ -/* Type declarations */ -/******************************************************************************/ -typedef void (*P_INIT_CALLBACK)(uint32_t Status); - -class cc3100_netcfg; - -class cc3100 -{ - -public: - - cc3100(PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi); - - ~cc3100(); - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - int32_t initializeAppVariables(); - - int32_t establishConnectionWithAP(void); - - int32_t checkLanConnection(void); - - int32_t checkInternetConnection(void); - - int32_t createUDPConnection(void); - - int32_t createConnection(uint32_t DestinationIP); - - int32_t getChunkSize(int32_t *len, uint8_t **p_Buff, uint32_t *chunk_size); - - int32_t hexToi(unsigned char *ptr); - -// int32_t getFile(void); - - int32_t disconnectFromAP(void); - - uint16_t itoa(int16_t cNum, uint8_t *cString); - - int32_t configureSimpleLinkToDefaultState(void); - - int16_t _sl_GetStartResponseConvert(uint32_t Status); - - void _sl_HandleAsync_InitComplete(void *pVoidBuf); - - bool IS_PING_DONE(uint32_t status_variable,const uint32_t bit); - bool IS_CONNECTED(uint32_t status_variable,const uint32_t bit); - bool IS_STA_CONNECTED(uint32_t status_variable,const uint32_t bit); - bool IS_IP_ACQUIRED(uint32_t status_variable,const uint32_t bit); - bool IS_IP_LEASED(uint32_t status_variable,const uint32_t bit); - bool IS_CONNECTION_FAILED(uint32_t status_variable,const uint32_t bit); - bool IS_P2P_NEG_REQ_RECEIVED(uint32_t status_variable,const uint32_t bit); - bool IS_SMARTCONFIG_DONE(uint32_t status_variable,const uint32_t bit); - bool IS_SMARTCONFIG_STOPPED(uint32_t status_variable,const uint32_t bit); - - - - void CLR_STATUS_BIT(uint32_t status_variable, const uint32_t bit); - void SET_STATUS_BIT(uint32_t status_variable, const uint32_t bit); - - - /*! - \brief Start the SimpleLink device - - This function initialize the communication interface, set the enable pin - of the device, and call to the init complete callback. - - \param[in] pIfHdl Opened Interface Object. In case the interface - must be opened outside the SimpleLink Driver, the - user might give the handler to be used in \n - any access of the communication interface with the - device (UART/SPI). \n - The SimpleLink driver will open an interface port - only if this parameter is null! \n - \param[in] pDevName The name of the device to open. Could be used when - the pIfHdl is null, to transfer information to the - open interface function \n - This pointer could be used to pass additional information to - sl_IfOpen in case it is required (e.g. UART com port name) - \param[in] pInitCallBack Pointer to function that would be called - on completion of the initialization process.\n - If this parameter is NULL the function is - blocked until the device initialization - is completed, otherwise the function returns - immediately. - - \return Returns the current active role (STA/AP/P2P) or an error code: - - ROLE_STA, ROLE_AP, ROLE_P2P in case of success, - otherwise in failure one of the following is return: - - ROLE_STA_ERR (Failure to load MAC/PHY in STA role) - - ROLE_AP_ERR (Failure to load MAC/PHY in AP role) - - ROLE_P2P_ERR (Failure to load MAC/PHY in P2P role) - - - \sa sl_Stop - - \note belongs to \ref basic_api - - \warning This function must be called before any other SimpleLink API is used, or after sl_Stop is called for reinit the device - \par Example: - \code - An example for open interface without callback routine. The interface name and handler are - handled by the sl_IfOpen routine: - - if( sl_Start(NULL, NULL, NULL) < 0 ) - { - LOG("Error opening interface to device\n"); - } - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_Start) - int16_t sl_Start(const void* pIfHdl, int8_t* pDevName, const P_INIT_CALLBACK pInitCallBack); -#endif - - /*! - \brief Stop the SimpleLink device - - This function clears the enable pin of the device, closes the communication \n - interface and invokes the stop complete callback - - \param[in] timeout Stop timeout in msec. Should be used to give the device time to finish \n - any transmission/reception that is not completed when the function was called. \n - Additional options: - - 0 Enter to hibernate immediately \n - - 0xFFFF Host waits for device's response before \n - hibernating, without timeout protection \n - - 0 < Timeout[msec] < 0xFFFF Host waits for device's response before \n - hibernating, with a defined timeout protection \n - This timeout defines the max time to wait. The NWP \n - response can be sent earlier than this timeout. - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_Start - - \note This API will shutdown the device and invoke the "i/f close" function regardless \n - if it was opened implicitly or explicitly. \n - It is up to the platform interface library to properly handle interface close \n - routine \n - belongs to \ref basic_api \n - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Stop) - int16_t sl_Stop(uint16_t timeout); -#endif - - - /*! - \brief Internal function for setting device configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] DeviceSetId configuration id - \param[in] Option configurations option - \param[in] ConfigLen configurations len - \param[in] pValues configurations values - - \sa - \note - \warning - \par Examples: - \code - Setting device time and date example: - - SlDateTime_t dateTime= {0}; - dateTime.sl_tm_day = (uint32_t)23; // Day of month (DD format) range 1-13 - dateTime.sl_tm_mon = (uint32_t)6; // Month (MM format) in the range of 1-12 - dateTime.sl_tm_year = (uint32_t)2014; // Year (YYYY format) - dateTime.sl_tm_hour = (uint32_t)17; // Hours in the range of 0-23 - dateTime.sl_tm_min = (uint32_t)55; // Minutes in the range of 0-59 - dateTime.sl_tm_sec = (uint32_t)22; // Seconds in the range of 0-59 - sl_DevSet(SL_DEVICE_GENERAL_CONFIGURATION, - SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME, - sizeof(SlDateTime_t), - (uint8_t *)(&dateTime)); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_DevSet) - int32_t sl_DevSet(uint8_t DeviceSetId ,uint8_t Option,uint8_t ConfigLen, uint8_t *pValues); -#endif - - /*! - \brief Internal function for getting device configurations - \return On success, zero is returned. On error, -1 is - returned - \param[in] DeviceGetId configuration id - example SL_DEVICE_STATUS - \param[out] pOption Get configurations option, example for get status options - - SL_EVENT_CLASS_GLOBAL - - SL_EVENT_CLASS_DEVICE - - SL_EVENT_CLASS_WLAN - - SL_EVENT_CLASS_BSD - - SL_EVENT_CLASS_NETAPP - - SL_EVENT_CLASS_NETCFG - - SL_EVENT_CLASS_FS - \param[out] pConfigLen The length of the allocated memory as input, when the - function complete, the value of this parameter would be - the len that actually read from the device.\n - If the device return length that is longer from the input - value, the function will cut the end of the returned structure - and will return SL_ESMALLBUF - \param[out] pValues Get configurations values - \sa - \note - \warning - \par Examples: - \code - Example for getting WLAN class status: - uint32_t statusWlan; - uint8_t pConfigOpt; - uint8_t pConfigLen; - pConfigOpt = SL_EVENT_CLASS_WLAN; - sl_DevGet(SL_DEVICE_STATUS,&pConfigOpt,&pConfigLen,(uint8_t *)(&statusWlan)); - Example for getting version: - SlVersionFull ver; - pConfigOpt = SL_DEVICE_GENERAL_VERSION; - sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION,&pConfigOpt,&pConfigLen,(uint8_t *)(&ver)); - printf("CHIP %d\nMAC 31.%d.%d.%d.%d\nPHY %d.%d.%d.%d\nNWP %d.%d.%d.%d\nROM %d\nHOST %d.%d.%d.%d\n", - ver.ChipFwAndPhyVersion.ChipId, - ver.ChipFwAndPhyVersion.FwVersion[0],ver.ChipFwAndPhyVersion.FwVersion[1], - ver.ChipFwAndPhyVersion.FwVersion[2],ver.ChipFwAndPhyVersion.FwVersion[3], - ver.ChipFwAndPhyVersion.PhyVersion[0],ver.ChipFwAndPhyVersion.PhyVersion[1], - ver.ChipFwAndPhyVersion.PhyVersion[2],ver.ChipFwAndPhyVersion.PhyVersion[3], - ver.NwpVersion[0],ver.NwpVersion[1],ver.NwpVersion[2],ver.NwpVersion[3], - ver.RomVersion, - SL_MAJOR_VERSION_NUM,SL_MINOR_VERSION_NUM,SL_VERSION_NUM,SL_SUB_VERSION_NUM); - - \endcode - \code - Getting Device time and date example: - - SlDateTime_t dateTime = {0}; - int8_t configLen = sizeof(SlDateTime_t); - int8_t configOpt = SL_DEVICE_GENERAL_CONFIGURATION_DATE_TIME; - sl_DevGet(SL_DEVICE_GENERAL_CONFIGURATION,&configOpt, &configLen,(uint8_t *)(&dateTime)); - - printf("Day %d,Mon %d,Year %d,Hour %,Min %d,Sec %d\n",dateTime.sl_tm_day,dateTime.sl_tm_mon,dateTime.sl_tm_year - dateTime.sl_tm_hour,dateTime.sl_tm_min,dateTime.sl_tm_sec); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_DevGet) - int32_t sl_DevGet(uint8_t DeviceGetId, uint8_t *pOption,uint8_t *pConfigLen, uint8_t *pValues); -#endif - - - /*! - \brief Set asynchronous event mask - - Mask asynchronous events from the device. Masked events do not - generate asynchronous messages from the device. - By default - all events are active - - \param[in] EventClass The classification groups that the - mask is referred to. Need to be one of - the following: - - SL_EVENT_CLASS_GLOBAL - - SL_EVENT_CLASS_DEVICE - - SL_EVENT_CLASS_WLAN - - SL_EVENT_CLASS_BSD - - SL_EVENT_CLASS_NETAPP - - SL_EVENT_CLASS_NETCFG - - SL_EVENT_CLASS_FS - - - \param[in] Mask Event Mask bitmap. Valid mask are (per group): - - SL_EVENT_CLASS_WLAN user events - - SL_WLAN_CONNECT_EVENT - - SL_WLAN_DISCONNECT_EVENT - - SL_EVENT_CLASS_DEVICE user events - - SL_DEVICE_FATAL_ERROR_EVENT - - SL_EVENT_CLASS_BSD user events - - SL_SOCKET_TX_FAILED_EVENT - - SL_SOCKET_ASYNC_EVENT - - SL_EVENT_CLASS_NETAPP user events - - SL_NETAPP_IPV4_IPACQUIRED_EVENT - - SL_NETAPP_IPV6_IPACQUIRED_EVENT - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_EventMaskGet - - \note belongs to \ref ext_api - - \warning - \par Example: - \code - - An example of masking connection/disconnection async events from WLAN class: - sl_EventMaskSet(SL_EVENT_CLASS_WLAN, (SL_WLAN_CONNECT_EVENT | SL_WLAN_DISCONNECT_EVENT) ); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_EventMaskSet) - int16_t sl_EventMaskSet(uint8_t EventClass , uint32_t Mask); -#endif - - /*! - \brief Get current event mask of the device - - return the events bit mask from the device. In case that event is - masked, the device is not sending this event. - - \param[in] EventClass The classification groups that the - mask is referred to. Need to be one of - the following: - - SL_EVENT_CLASS_GLOBAL - - SL_EVENT_CLASS_DEVICE - - SL_EVENT_CLASS_WLAN - - SL_EVENT_CLASS_BSD - - SL_EVENT_CLASS_NETAPP - - SL_EVENT_CLASS_NETCFG - - SL_EVENT_CLASS_FS - - \param[out] pMask Pointer to Mask bitmap where the - value should be stored. Bitmasks are the same as in \ref sl_EventMaskSet - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_EventMaskSet - - \note belongs to \ref ext_api - - \warning - \par Example: - \code - - An example of getting an event mask for WLAN class - uint32_t maskWlan; - sl_StatusGet(SL_EVENT_CLASS_WLAN,&maskWlan); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_EventMaskGet) - int16_t sl_EventMaskGet(uint8_t EventClass, uint32_t *pMask); -#endif - - - /*! - \brief the simple link task entry - - \Param - This function must be called from the main loop or from dedicated thread in - the following cases: - - Non-Os Platform - should be called from the mail loop - - Multi Threaded Platform when the user does not implement the external spawn functions - - should be called from dedicated thread allocated to the simplelink driver. - In this mode the function never return. - - \return None - - \sa sl_Stop - - \note belongs to \ref basic_api - - \warning This function must be called from a thread that is start running before - any call to other simple link API - */ -#if _SL_INCLUDE_FUNC(sl_Task) - void sl_Task(void); -#endif - - - /*! - \brief Setting the internal uart mode - - \param[in] pUartParams Pointer to the uart configuration parameter set: - baudrate - up to 711 Kbps - flow control - enable/disable - comm port - the comm port number - - \return On success zero is returned, otherwise - Failed. - - \sa sl_Stop - - \note belongs to \ref basic_api - - \warning This function must consider the host uart capability - */ -#ifdef SL_IF_TYPE_UART -#if _SL_INCLUDE_FUNC(sl_UartSetMode) - int16_t sl_UartSetMode(const SlUartIfParams_t* pUartParams); -#endif -#endif - -public: - - cc3100_spi _spi; - cc3100_driver _driver; - cc3100_nonos _nonos; - cc3100_wlan _wlan; - cc3100_wlan_rx_filters _wlan_filters; - cc3100_netapp _netapp; - cc3100_fs _fs; - cc3100_netcfg _netcfg; - cc3100_socket _socket; - cc3100_flowcont _flowcont; - - -protected: - - -};//class - -}//namespace mbed_cc3100 - -/*! - - Close the Doxygen group. - @} - - */ - - -#endif /* __DEVICE_H__ */ - - -
--- a/simplelink/cc3100_driver.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1350 +0,0 @@ -/* -* driver.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 "fPtr_func.h" - -//#include "cc3100_device.h" - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -namespace mbed_cc3100 { - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) -typedef struct { - uint32_t Align; - _SlDriverCb_t DriverCB; - uint8_t AsyncRespBuf[SL_ASYNC_MAX_MSG_LEN]; -} _SlStatMem_t; - -_SlStatMem_t g_StatMem; -#endif - - -_SlDriverCb_t* g_pCB = NULL; - -uint8_t gFirstCmdMode = 0; - -const _SlSyncPattern_t g_H2NSyncPattern = H2N_SYNC_PATTERN; -const _SlSyncPattern_t g_H2NCnysPattern = H2N_CNYS_PATTERN; -const _SlActionLookup_t _SlActionLookupTable[7] = { - {ACCEPT_ID, SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE, (_SlSpawnEntryFunc_t) &_sl_HandleAsync_Accept}, - {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Connect}, - {SELECT_ID, SL_OPCODE_SOCKET_SELECTASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Select}, - {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_DnsGetHostByName}, - {GETHOSYBYSERVICE_ID, SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_DnsGetHostByService}, - {PING_ID, SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE, (_SlSpawnEntryFunc_t) &_sl_HandleAsync_PingResponse}, - {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Stop} - -}; - -cc3100_driver::cc3100_driver(cc3100_nonos &nonos, cc3100_netapp &netapp, cc3100_flowcont &flowcont, cc3100_spi &spi) - : _nonos(nonos),_netapp(netapp), _flowcont(flowcont), _spi(spi) -{ - -} - -cc3100_driver::~cc3100_driver() -{ - -} - -/*****************************************************************************/ -/* Variables */ -/*****************************************************************************/ - -/********************************************************************************/ - -/*****************************************************************************/ -/* Internal functions */ -/*****************************************************************************/ -bool cc3100_driver::_SL_PENDING_RX_MSG(pDriver* pDriverCB){ - - if((pDriverCB)->RxIrqCnt != (pDriverCB)->RxDoneCnt){ - return TRUE; - }else{ - return FALSE; - } -} - -/***************************************************************************** -_SlDrvDriverCBInit - init Driver Control Block -*****************************************************************************/ -void cc3100_driver::_SlDrvDriverCBInit(void) -{ - - uint8_t Idx; - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - g_pCB = &(g_StatMem.DriverCB); -#else - g_pCB = sl_Malloc(sizeof(_SlDriverCb_t)); -#endif - - MALLOC_OK_CHECK(g_pCB); - memset((g_pCB), 0, sizeof(_SlDriverCb_t)); - - OSI_RET_OK_CHECK( _nonos.sl_SyncObjCreate(&g_pCB->CmdSyncObj, "CmdSyncObj") ); - _nonos.sl_SyncObjClear(&g_pCB->CmdSyncObj); - - OSI_RET_OK_CHECK( _nonos.sl_LockObjCreate(&g_pCB->GlobalLockObj, "GlobalLockObj") ); - - OSI_RET_OK_CHECK( _nonos.sl_LockObjCreate(&g_pCB->ProtectionLockObj, "ProtectionLockObj") ); - - _SlDrvObjInit(); - for (Idx = 0; Idx < MAX_CONCURRENT_ACTIONS; Idx++) { - OSI_RET_OK_CHECK( _nonos.sl_SyncObjCreate(&g_pCB->ObjPool[Idx].SyncObj, "SyncObj") ); - _nonos.sl_SyncObjClear(&g_pCB->ObjPool[Idx].SyncObj); - } - _flowcont._SlDrvFlowContInit(); - gFirstCmdMode = 0; -} - -/***************************************************************************** -_SlDrvDriverCBDeinit - De init Driver Control Block -*****************************************************************************/ -void cc3100_driver::_SlDrvDriverCBDeinit() -{ - uint8_t Idx; - _flowcont._SlDrvFlowContDeinit(); - - OSI_RET_OK_CHECK( _nonos.sl_SyncObjDelete(&g_pCB->CmdSyncObj, 0) ); - OSI_RET_OK_CHECK( _nonos.sl_LockObjDelete(&g_pCB->GlobalLockObj, 0) ); - OSI_RET_OK_CHECK( _nonos.sl_LockObjDelete(&g_pCB->ProtectionLockObj, 0) ); - for (Idx = 0; Idx < MAX_CONCURRENT_ACTIONS; Idx++) { - OSI_RET_OK_CHECK( _nonos.sl_SyncObjDelete(&g_pCB->ObjPool[Idx].SyncObj, 0) ); - } - - _SlDrvObjDeInit(); - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - g_pCB = NULL; -#else - sl_Free(g_pCB); -#endif - - g_pCB = NULL; -} - -/***************************************************************************** -_SlDrvRxIrqHandler - Interrupt handler -*****************************************************************************/ - -void cc3100_driver::_SlDrvRxIrqHandler(void *pValue) -{ - - - _spi.MaskIntHdlr(); - g_pCB->RxIrqCnt++; - if (TRUE == g_pCB->IsCmdRespWaited) { - OSI_RET_OK_CHECK( _nonos.sl_SyncObjSignalFromIRQ(&g_pCB->CmdSyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE) ); - } else { - _nonos._SlNonOsSpawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0); - } -} - -/***************************************************************************** -_SlDrvCmdOp -*****************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl,void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt) -{ - - _SlReturnVal_t RetVal; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->IsCmdRespWaited = TRUE; - SL_TRACE0(DBG_MSG, MSG_312, "_SlDrvCmdOp: call _SlDrvMsgWrite"); - /* send the message */ - g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl; - g_pCB->FunctionParams.pTxRxDescBuff = (uint8_t*)pTxRxDescBuff; - g_pCB->FunctionParams.pCmdExt = pCmdExt; - - RetVal = _SlDrvMsgWrite(); - - if(SL_OS_RET_CODE_OK == RetVal) { - -#ifndef SL_IF_TYPE_UART - /* Waiting for SPI to stabilize after first command */ - if( 0 == gFirstCmdMode ) { - gFirstCmdMode = 1; - wait_ms(2); - } -#endif - - /* wait for respond */ - RetVal = _SlDrvMsgReadCmdCtx(); /* will free global lock */ - SL_TRACE0(DBG_MSG, MSG_314, "_SlDrvCmdOp: exited _SlDrvMsgReadCmdCtx"); - - } else { - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - } - return RetVal; -} - -/***************************************************************************** -_SlDrvCmdSend -Send SL command without waiting for command response -This function is unprotected and the caller should make -sure global lock is active -*****************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl, void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt) -{ - _SlReturnVal_t RetVal; - - g_pCB->IsCmdRespWaited = FALSE; - - SL_TRACE0(DBG_MSG, MSG_312, "_SlDrvCmdSend: call _SlDrvMsgWrite"); - /* send the message */ - g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl; - g_pCB->FunctionParams.pTxRxDescBuff = (uint8_t*)pTxRxDescBuff; - g_pCB->FunctionParams.pCmdExt = pCmdExt; - - RetVal = _SlDrvMsgWrite(); - - return RetVal; -} - -/***************************************************************************** -_SlDrvDataReadOp -*****************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl, void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt) -{ - _SlReturnVal_t RetVal; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - _SlArgsData_t pArgsData; - - /* Validate input arguments */ - VERIFY_PROTOCOL(NULL != pCmdExt->pRxPayload); - - /* If zero bytes is requested, return error. */ - /* This allows us not to fill remote socket's IP address in return arguments */ - VERIFY_PROTOCOL(0 != pCmdExt->RxPayloadLen); - - /* Validate socket */ - if((Sd & BSD_SOCKET_ID_MASK) >= SL_MAX_SOCKETS) { - return SL_EBADF; - } - - /*Use Obj to issue the command, if not available try later*/ - ObjIdx = (uint8_t)_SlDrvWaitForPoolObj(RECV_ID, Sd & BSD_SOCKET_ID_MASK); - - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - pArgsData.pData = pCmdExt->pRxPayload; - pArgsData.pArgs = (uint8_t *)pTxRxDescBuff; - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&pArgsData; - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - - /* Do Flow Control check/update for DataWrite operation */ - OSI_RET_OK_CHECK( _nonos.sl_LockObjLock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER) ); - - /* Clear SyncObj for the case it was signalled before TxPoolCnt */ - /* dropped below '1' (last Data buffer was taken) */ - /* OSI_RET_OK_CHECK( sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj) ); */ - _nonos.sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj); - - if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN) { - - /* If TxPoolCnt was increased by other thread at this moment, - TxSyncObj won't wait here */ - OSI_RET_OK_CHECK( _nonos.sl_SyncObjWait(&g_pCB->FlowContCB.TxSyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER) ); - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN); - g_pCB->FlowContCB.TxPoolCnt--; - - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - - /* send the message */ - g_pCB->TempProtocolHeader.Opcode = pCmdCtrl->Opcode; - g_pCB->TempProtocolHeader.Len = _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt); - g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl; - g_pCB->FunctionParams.pTxRxDescBuff = (uint8_t *)pTxRxDescBuff; - g_pCB->FunctionParams.pCmdExt = pCmdExt; - RetVal = _SlDrvMsgWrite(); - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - if(SL_OS_RET_CODE_OK == RetVal) { - /* Wait for response message. Will be signalled by _SlDrvMsgRead. */ - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - } - - _SlDrvReleasePoolObj(ObjIdx); - return RetVal; -} - -/* ******************************************************************************/ -/* _SlDrvDataWriteOp */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl, void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt) -{ - _SlReturnVal_t RetVal = SL_EAGAIN; /* initiated as SL_EAGAIN for the non blocking mode */ - while( 1 ) { - /* Do Flow Control check/update for DataWrite operation */ - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - /* Clear SyncObj for the case it was signalled before TxPoolCnt */ - /* dropped below '1' (last Data buffer was taken) */ - /* OSI_RET_OK_CHECK( sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj) ); */ - _nonos.sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj); - /* we have indication that the last send has failed - socket is no longer valid for operations */ - if(g_pCB->SocketTXFailure & (1<<(Sd & BSD_SOCKET_ID_MASK))) { - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - return SL_SOC_ERROR; - } - - if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN + 1) { - /* we have indication that this socket is set as blocking and we try to */ - /* unblock it - return an error */ - if( g_pCB->SocketNonBlocking >> (Sd & BSD_SOCKET_ID_MASK) ) { - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - return RetVal; - } - /* If TxPoolCnt was increased by other thread at this moment, */ - /* TxSyncObj won't wait here */ - OSI_RET_OK_CHECK( _nonos.sl_SyncObjWait(&g_pCB->FlowContCB.TxSyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER) ); - } - - if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + 1 ) { - break; - } else { - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - } - } - OSI_RET_OK_CHECK( _nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER) ); - - VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + 1 ); - g_pCB->FlowContCB.TxPoolCnt--; - - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->FlowContCB.TxLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - - /* send the message */ - g_pCB->TempProtocolHeader.Opcode = pCmdCtrl->Opcode; - g_pCB->TempProtocolHeader.Len = _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt); - g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl; - g_pCB->FunctionParams.pTxRxDescBuff = (unsigned char*)pTxRxDescBuff; - g_pCB->FunctionParams.pCmdExt = pCmdExt; - - RetVal = _SlDrvMsgWrite(); - - OSI_RET_OK_CHECK( _nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE) ); - - return RetVal; -} - -/* ******************************************************************************/ -/* _SlDrvMsgWrite */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvMsgWrite(void) -{ - - VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.pCmdCtrl); - - g_pCB->TempProtocolHeader.Opcode = g_pCB->FunctionParams.pCmdCtrl->Opcode; - g_pCB->TempProtocolHeader.Len = _SL_PROTOCOL_CALC_LEN(g_pCB->FunctionParams.pCmdCtrl, - g_pCB->FunctionParams.pCmdExt); - /* */ - if (g_pCB->RelayFlagsViaRxPayload == TRUE) { - g_pCB->TempProtocolHeader.Len = g_pCB->TempProtocolHeader.Len + g_pCB->FunctionParams.pCmdExt->RxPayloadLen; - } - -#ifdef SL_START_WRITE_STAT - sl_IfStartWriteSequence(g_pCB->FD); -#endif - -#ifdef SL_IF_TYPE_UART - /* Write long sync pattern */ - _spi.spi_Write(g_pCB->FD, (uint8_t *)&g_H2NSyncPattern.Long, 2*SYNC_PATTERN_LEN); -#else - /* Write short sync pattern */ - _spi.spi_Write(g_pCB->FD, (uint8_t *)&g_H2NSyncPattern.Short, SYNC_PATTERN_LEN); -#endif - - /* Header */ - _spi.spi_Write(g_pCB->FD, (uint8_t *)&g_pCB->TempProtocolHeader, _SL_CMD_HDR_SIZE); - - /* Descriptors */ - if (g_pCB->FunctionParams.pTxRxDescBuff && g_pCB->FunctionParams.pCmdCtrl->TxDescLen > 0) { - _spi.spi_Write(g_pCB->FD, g_pCB->FunctionParams.pTxRxDescBuff, - _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdCtrl->TxDescLen)); - } - - /* A special mode where Rx payload and Rx length are used as Tx as well */ - /* This mode requires no Rx payload on the response and currently used by fs_Close and sl_Send on */ - /* transceiver mode */ - if (g_pCB->RelayFlagsViaRxPayload == TRUE ) { - g_pCB->RelayFlagsViaRxPayload = FALSE; - _spi.spi_Write(g_pCB->FD, g_pCB->FunctionParams.pCmdExt->pRxPayload, - _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdExt->RxPayloadLen)); - } - - /* Payload */ - if (g_pCB->FunctionParams.pCmdExt && g_pCB->FunctionParams.pCmdExt->TxPayloadLen > 0) { - /* If the message has payload, it is mandatory that the message's arguments are protocol aligned. */ - /* Otherwise the aligning of arguments will create a gap between arguments and payload. */ - VERIFY_PROTOCOL(_SL_IS_PROTOCOL_ALIGNED_SIZE(g_pCB->FunctionParams.pCmdCtrl->TxDescLen)); - - _spi.spi_Write(g_pCB->FD, g_pCB->FunctionParams.pCmdExt->pTxPayload, - _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdExt->TxPayloadLen)); - } - - - _SL_DBG_CNT_INC(MsgCnt.Write); - -#ifdef SL_START_WRITE_STAT - sl_IfEndWriteSequence(g_pCB->FD); -#endif - - return SL_OS_RET_CODE_OK; -} - -/* ******************************************************************************/ -/* _SlDrvMsgRead */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvMsgRead(void) -{ - /* alignment for small memory models */ - union { - uint8_t TempBuf[_SL_RESP_HDR_SIZE]; - uint32_t DummyBuf[2]; - } uBuf; - - uint8_t TailBuffer[4]; - uint16_t LengthToCopy; - uint16_t AlignedLengthRecv; - uint8_t AlignSize; - - VERIFY_RET_OK(_SlDrvRxHdrRead((uint8_t*)(uBuf.TempBuf), &AlignSize)); - - /* 'Init Compelete' message bears no valid FlowControl info */ - if(SL_OPCODE_DEVICE_INITCOMPLETE != OPCODE(uBuf.TempBuf)) { - g_pCB->FlowContCB.TxPoolCnt = ((_SlResponseHeader_t *)uBuf.TempBuf)->TxPoolCnt; - g_pCB->SocketNonBlocking = ((_SlResponseHeader_t *)uBuf.TempBuf)->SocketNonBlocking; - g_pCB->SocketTXFailure = ((_SlResponseHeader_t *)uBuf.TempBuf)->SocketTXFailure; - - if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjSignal(&g_pCB->FlowContCB.TxSyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - } - } - - _SlDrvClassifyRxMsg(OPCODE(uBuf.TempBuf)); - - switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) { - case ASYNC_EVT_CLASS: - - VERIFY_PROTOCOL(NULL == g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = g_StatMem.AsyncRespBuf; -#else - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = sl_Malloc(SL_ASYNC_MAX_MSG_LEN); -#endif - MALLOC_OK_CHECK(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - - memcpy(g_pCB->FunctionParams.AsyncExt.pAsyncBuf, uBuf.TempBuf, _SL_RESP_HDR_SIZE); - - /* This is an Async message. Read the rest of it. */ - if (_SL_PROTOCOL_ALIGN_SIZE(RSP_PAYLOAD_LEN(uBuf.TempBuf)) <= SL_ASYNC_MAX_PAYLOAD_LEN) { - AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(RSP_PAYLOAD_LEN(uBuf.TempBuf)); - } else { - AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(SL_ASYNC_MAX_PAYLOAD_LEN); - } - - if (RSP_PAYLOAD_LEN(uBuf.TempBuf) > 0) { - _spi.spi_Read(g_pCB->FD, g_pCB->FunctionParams.AsyncExt.pAsyncBuf + _SL_RESP_HDR_SIZE, AlignedLengthRecv); - } - /* In case ASYNC RX buffer length is smaller then the received data length, dump the rest */ - if ((_SL_PROTOCOL_ALIGN_SIZE(RSP_PAYLOAD_LEN(uBuf.TempBuf)) > SL_ASYNC_MAX_PAYLOAD_LEN)) { - AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(RSP_PAYLOAD_LEN(uBuf.TempBuf)) - SL_ASYNC_MAX_PAYLOAD_LEN; - while (AlignedLengthRecv > 0) { - _spi.spi_Read(g_pCB->FD,TailBuffer,4); - AlignedLengthRecv = AlignedLengthRecv - 4; - } - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - if ((SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE == OPCODE(uBuf.TempBuf)) || (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE_V6 == OPCODE(uBuf.TempBuf)) || (SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE == OPCODE(uBuf.TempBuf))) { - /* go over the active list if exist to find obj waiting for this Async event */ - _SlFindAndSetActiveObj(OPCODE(uBuf.TempBuf),(((_SocketResponse_t *)(g_pCB->FunctionParams.AsyncExt.pAsyncBuf + _SL_RESP_HDR_SIZE))->sd) & BSD_SOCKET_ID_MASK); - } else { - _SlFindAndSetActiveObj(OPCODE(uBuf.TempBuf),SL_MAX_SOCKETS); - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - break; - - case RECV_RESP_CLASS: { - uint8_t ExpArgSize; /* Expected size of Recv/Recvfrom arguments */ - - switch(OPCODE(uBuf.TempBuf)) { - case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE: - ExpArgSize = RECVFROM_IPV4_ARGS_SIZE; - break; - case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6: - ExpArgSize = RECVFROM_IPV6_ARGS_SIZE; - break; - default: - /* SL_OPCODE_SOCKET_RECVASYNCRESPONSE: */ - ExpArgSize = RECV_ARGS_SIZE; - } - - /* Read first 4 bytes of Recv/Recvfrom response to get SocketId and actual */ - /* response data length */ - _spi.spi_Read(g_pCB->FD, &uBuf.TempBuf[4], RECV_ARGS_SIZE); - - /* Validate Socket ID and Received Length value. */ - VERIFY_PROTOCOL((SD(&uBuf.TempBuf[4])& BSD_SOCKET_ID_MASK) < SL_MAX_SOCKETS); - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - /* go over the active list if exist to find obj waiting for this Async event */ - VERIFY_RET_OK(_SlFindAndSetActiveObj(OPCODE(uBuf.TempBuf),SD(&uBuf.TempBuf[4]) & BSD_SOCKET_ID_MASK)); - - /* Verify data is waited on this socket. The pArgs should have been set by _SlDrvDataReadOp(). */ - VERIFY_SOCKET_CB(NULL != ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData))->pArgs); - - memcpy( ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs, &uBuf.TempBuf[4], RECV_ARGS_SIZE); - - if(ExpArgSize > RECV_ARGS_SIZE) { - _spi.spi_Read(g_pCB->FD, - ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs + RECV_ARGS_SIZE, - ExpArgSize - RECV_ARGS_SIZE); - } - - /* Here g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData contains requested(expected) Recv/Recvfrom DataSize. */ - /* Overwrite requested DataSize with actual one. */ - /* If error is received, this information will be read from arguments. */ - if(ACT_DATA_SIZE(&uBuf.TempBuf[4]) > 0) { - VERIFY_SOCKET_CB(NULL != ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData); - - /* Read 4 bytes aligned from interface */ - /* therefore check the requested length and read only */ - /* 4 bytes aligned data. The rest unaligned (if any) will be read */ - /* and copied to a TailBuffer */ - LengthToCopy = ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (3); - AlignedLengthRecv = ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (~3); - if( AlignedLengthRecv >= 4) { - _spi.spi_Read(g_pCB->FD,((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData,AlignedLengthRecv ); - } - /* copy the unaligned part, if any */ - if( LengthToCopy > 0) { - _spi.spi_Read(g_pCB->FD,TailBuffer,4); - /* copy TailBuffer unaligned part (1/2/3 bytes) */ - memcpy(((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData + AlignedLengthRecv,TailBuffer,LengthToCopy); - } - } - OSI_RET_OK_CHECK(_nonos.sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - } - break; - - case CMD_RESP_CLASS: - - /* Some commands pass a maximum arguments size. */ - /* In this case Driver will send extra dummy patterns to NWP if */ - /* the response message is smaller than maximum. */ - /* When RxDescLen is not exact, using RxPayloadLen is forbidden! */ - /* If such case cannot be avoided - parse message here to detect */ - /* arguments/payload border. */ - _spi.spi_Read(g_pCB->FD, g_pCB->FunctionParams.pTxRxDescBuff, _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdCtrl->RxDescLen)); - - if((NULL != g_pCB->FunctionParams.pCmdExt) && (0 != g_pCB->FunctionParams.pCmdExt->RxPayloadLen)) { - /* Actual size of command's response payload: <msg_payload_len> - <rsp_args_len> */ - int16_t ActDataSize = RSP_PAYLOAD_LEN(uBuf.TempBuf) - g_pCB->FunctionParams.pCmdCtrl->RxDescLen; - - g_pCB->FunctionParams.pCmdExt->ActualRxPayloadLen = ActDataSize; - - /* Check that the space prepared by user for the response data is sufficient. */ - if(ActDataSize <= 0) { - g_pCB->FunctionParams.pCmdExt->RxPayloadLen = 0; - } else { - /* In case the user supplied Rx buffer length which is smaller then the received data length, copy according to user length */ - if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen) { - LengthToCopy = g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (3); - AlignedLengthRecv = g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3); - } else { - LengthToCopy = ActDataSize & (3); - AlignedLengthRecv = ActDataSize & (~3); - } - /* Read 4 bytes aligned from interface */ - /* therefore check the requested length and read only */ - /* 4 bytes aligned data. The rest unaligned (if any) will be read */ - /* and copied to a TailBuffer */ - - if( AlignedLengthRecv >= 4) { - _spi.spi_Read(g_pCB->FD, - g_pCB->FunctionParams.pCmdExt->pRxPayload, - AlignedLengthRecv ); - - } - /* copy the unaligned part, if any */ - if( LengthToCopy > 0) { - _spi.spi_Read(g_pCB->FD,TailBuffer,4); - /* copy TailBuffer unaligned part (1/2/3 bytes) */ - memcpy(g_pCB->FunctionParams.pCmdExt->pRxPayload + AlignedLengthRecv, - TailBuffer, - LengthToCopy); - ActDataSize = ActDataSize-4; - } - /* In case the user supplied Rx buffer length which is smaller then the received data length, dump the rest */ - if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen) { - /* calculate the rest of the data size to dump */ - AlignedLengthRecv = ActDataSize - (g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3)); - while( AlignedLengthRecv > 0) { - _spi.spi_Read(g_pCB->FD,TailBuffer, 4 ); - AlignedLengthRecv = AlignedLengthRecv - 4; - } - } - } - } - break; - - default: - /* DUMMY_MSG_CLASS: Flow control message has no payload. */ - break; - } - - if(AlignSize > 0) { - _spi.spi_Read(g_pCB->FD, uBuf.TempBuf, AlignSize); - } - - _SL_DBG_CNT_INC(MsgCnt.Read); - - /* Unmask Interrupt call */ - _spi.UnMaskIntHdlr(); - - return SL_OS_RET_CODE_OK; -} - -/* ******************************************************************************/ -/* _SlAsyncEventGenericHandler */ -/* ******************************************************************************/ -void cc3100_driver::_SlAsyncEventGenericHandler(void) -{ - _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)g_pCB->FunctionParams.AsyncExt.pAsyncBuf; - SlWlanEvent_t wlanEvent; - SlNetAppEvent_t netAppEvent; - SlSockEvent_t sockAppEvent; - - if (NULL != g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler) { - switch(pHdr->GenHeader.Opcode) { - - case SL_OPCODE_WLAN_P2P_DEV_FOUND: { - slPeerInfoAsyncResponse_t* pResp = (slPeerInfoAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - wlanEvent.Event = SL_WLAN_P2P_DEV_FOUND_EVENT; - memcpy(wlanEvent.EventData.P2PModeDevFound.mac,pResp->mac, 6); - memcpy(wlanEvent.EventData.P2PModeDevFound.go_peer_device_name,pResp->go_peer_device_name,pResp->go_peer_device_name_len); - wlanEvent.EventData.P2PModeDevFound.go_peer_device_name_len = pResp->go_peer_device_name_len; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - break; - } - - case SL_OPCODE_WLAN_P2P_NEG_REQ_RECEIVED: { - slPeerInfoAsyncResponse_t* pResp = (slPeerInfoAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - wlanEvent.Event = SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT; - memcpy(wlanEvent.EventData.P2PModeNegReqReceived.mac,pResp->mac, 6); - memcpy(wlanEvent.EventData.P2PModeNegReqReceived.go_peer_device_name,pResp->go_peer_device_name,pResp->go_peer_device_name_len); - wlanEvent.EventData.P2PModeNegReqReceived.go_peer_device_name_len = pResp->go_peer_device_name_len; - wlanEvent.EventData.P2PModeNegReqReceived.wps_dev_password_id = pResp->wps_dev_password_id; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - break; - } - case SL_OPCODE_WLAN_CONNECTION_FAILED: { - slWlanConnFailureAsyncResponse_t* pResp = (slWlanConnFailureAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - wlanEvent.Event = SL_WLAN_CONNECTION_FAILED_EVENT; - wlanEvent.EventData.P2PModewlanConnectionFailure.status = pResp->status; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - break; - } - - case SL_OPCODE_WLAN_WLANASYNCCONNECTEDRESPONSE: { - slWlanConnectAsyncResponse_t *pWlanResp = (slWlanConnectAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - memset(&wlanEvent.EventData.STAandP2PModeWlanConnected,0,sizeof(slWlanConnectAsyncResponse_t)); - wlanEvent.Event = SL_WLAN_CONNECT_EVENT; - wlanEvent.EventData.STAandP2PModeWlanConnected.connection_type = pWlanResp->connection_type; - memcpy(wlanEvent.EventData.STAandP2PModeWlanConnected.bssid, pWlanResp->bssid, 6); - memcpy(wlanEvent.EventData.STAandP2PModeWlanConnected.go_peer_device_name,pWlanResp->go_peer_device_name,pWlanResp->go_peer_device_name_len); - memcpy(wlanEvent.EventData.STAandP2PModeWlanConnected.ssid_name, pWlanResp->ssid_name, pWlanResp->ssid_len); - wlanEvent.EventData.STAandP2PModeWlanConnected.ssid_len = pWlanResp->ssid_len; - wlanEvent.EventData.STAandP2PModeWlanConnected.go_peer_device_name_len = pWlanResp->go_peer_device_name_len; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - break; - } - case SL_OPCODE_WLAN_WLANASYNCDISCONNECTEDRESPONSE: { - slWlanConnectAsyncResponse_t *pWlanResp = (slWlanConnectAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - memset(&wlanEvent.EventData.STAandP2PModeDisconnected,0,sizeof(slWlanConnectAsyncResponse_t)); - wlanEvent.Event = SL_WLAN_DISCONNECT_EVENT; - wlanEvent.EventData.STAandP2PModeDisconnected.connection_type = pWlanResp->connection_type; - memcpy(wlanEvent.EventData.STAandP2PModeDisconnected.bssid, pWlanResp->bssid, 6); - memcpy(wlanEvent.EventData.STAandP2PModeDisconnected.go_peer_device_name,pWlanResp->go_peer_device_name,pWlanResp->go_peer_device_name_len); - memcpy(wlanEvent.EventData.STAandP2PModeDisconnected.ssid_name, pWlanResp->ssid_name, pWlanResp->ssid_len); - wlanEvent.EventData.STAandP2PModeDisconnected.ssid_len = pWlanResp->ssid_len; - wlanEvent.EventData.STAandP2PModeDisconnected.reason_code = pWlanResp->reason_code; - wlanEvent.EventData.STAandP2PModeDisconnected.go_peer_device_name_len = pWlanResp->go_peer_device_name_len; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - break; - } - case SL_OPCODE_NETAPP_IPACQUIRED: { - SlIpV4AcquiredAsync_t *pIpV4 = (SlIpV4AcquiredAsync_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - netAppEvent.Event = SL_NETAPP_IPV4_IPACQUIRED_EVENT; - netAppEvent.EventData.ipAcquiredV4.ip = pIpV4->ip; - netAppEvent.EventData.ipAcquiredV4.gateway = pIpV4->gateway; - netAppEvent.EventData.ipAcquiredV4.dns = pIpV4->dns; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler((SlNetAppEvent_t*)&netAppEvent); - - } - break; - case SL_OPCODE_NETAPP_IPACQUIRED_V6: { - SlIpV6AcquiredAsync_t *pIpV6 = (SlIpV6AcquiredAsync_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - netAppEvent.Event = SL_NETAPP_IPV6_IPACQUIRED_EVENT; - memcpy((void *)&netAppEvent.EventData.ipAcquiredV6.ip[0],(void *)&pIpV6->ip[0],sizeof(pIpV6->ip[0])*4); - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&netAppEvent); - - } - break; - - case SL_OPCODE_NETAPP_IP_LEASED: { - SlIpLeasedAsync_t *pIpV4 = (SlIpLeasedAsync_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - netAppEvent.Event = SL_NETAPP_IP_LEASED_EVENT; - netAppEvent.EventData.ipLeased.ip_address = pIpV4->ip_address; - netAppEvent.EventData.ipLeased.lease_time = pIpV4->lease_time; - memcpy(netAppEvent.EventData.ipLeased.mac, pIpV4->mac, 6); - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&netAppEvent); - } - break; - - case SL_OPCODE_NETAPP_IP_RELEASED: { - SlIpReleasedAsync_t *pIpV4 = (SlIpReleasedAsync_t *)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - netAppEvent.Event = SL_NETAPP_IP_RELEASED_EVENT; - netAppEvent.EventData.ipReleased.ip_address = pIpV4->ip_address; - netAppEvent.EventData.ipReleased.reason = pIpV4->reason; - memcpy(netAppEvent.EventData.ipReleased.mac, pIpV4->mac, 6); - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&netAppEvent); - } - break; - - case SL_OPCODE_SOCKET_TXFAILEDASYNCRESPONSE: { - SlSockEventData_t *txfailparams = (SlSockEventData_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - sockAppEvent.Event = SL_SOCKET_TX_FAILED_EVENT; - memcpy((void *)&sockAppEvent.EventData,(void *)txfailparams,sizeof(SlSockEventData_t)); - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&sockAppEvent); - - } - break; - - case SL_OPCODE_SOCKET_SOCKETASYNCEVENT: { - SlSockEventData_t *socketAsyncEvent = (SlSockEventData_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - sockAppEvent.Event = SL_SOCKET_ASYNC_EVENT; - sockAppEvent.EventData.socketAsyncEvent.sd = socketAsyncEvent->socketAsyncEvent.sd; - sockAppEvent.EventData.socketAsyncEvent.type = socketAsyncEvent->socketAsyncEvent.type; /* one of the possible types of socket */ - sockAppEvent.EventData.socketAsyncEvent.val = socketAsyncEvent->socketAsyncEvent.val; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&sockAppEvent); - - } - break; - - case SL_OPCODE_WLAN_SMART_CONFIG_START_ASYNC_RESPONSE: { - slSmartConfigStartAsyncResponse_t *pResp = (slSmartConfigStartAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - - wlanEvent.Event = SL_WLAN_SMART_CONFIG_COMPLETE_EVENT; - wlanEvent.EventData.smartConfigStartResponse.status = pResp->status; - wlanEvent.EventData.smartConfigStartResponse.ssid_len = pResp->ssid_len; - wlanEvent.EventData.smartConfigStartResponse.private_token_len = pResp->private_token_len; - memset(wlanEvent.EventData.smartConfigStartResponse.ssid, 0x00, sizeof(wlanEvent.EventData.smartConfigStartResponse.ssid)); - memcpy(wlanEvent.EventData.smartConfigStartResponse.ssid, pResp->ssid, pResp->ssid_len); - /* if private data exist */ - if (pResp->private_token_len) { - memset(wlanEvent.EventData.smartConfigStartResponse.private_token, 0x00, sizeof(wlanEvent.EventData.smartConfigStartResponse.private_token)); - memcpy(wlanEvent.EventData.smartConfigStartResponse.private_token, pResp->private_token, pResp->private_token_len); - } - - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - } - break; - - case SL_OPCODE_WLAN_SMART_CONFIG_STOP_ASYNC_RESPONSE: { - slSmartConfigStopAsyncResponse_t *pResp = (slSmartConfigStopAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - wlanEvent.Event = SL_WLAN_SMART_CONFIG_STOP_EVENT; - wlanEvent.EventData.smartConfigStopResponse.status = pResp->status; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - } - break; - - case SL_OPCODE_WLAN_STA_CONNECTED: { - slPeerInfoAsyncResponse_t* pResp = (slPeerInfoAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - memset(&wlanEvent.EventData.APModeStaConnected,0,sizeof(slPeerInfoAsyncResponse_t)); - wlanEvent.Event = SL_WLAN_STA_CONNECTED_EVENT; - memcpy(wlanEvent.EventData.APModeStaConnected.mac,pResp->mac, 6); - memcpy(wlanEvent.EventData.APModeStaConnected.go_peer_device_name,pResp->go_peer_device_name,pResp->go_peer_device_name_len); - wlanEvent.EventData.APModeStaConnected.go_peer_device_name_len = pResp->go_peer_device_name_len; - memcpy(wlanEvent.EventData.APModeStaConnected.own_ssid,pResp->own_ssid,pResp->own_ssid_len); - wlanEvent.EventData.APModeStaConnected.own_ssid_len = pResp->own_ssid_len; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - - } - break; - - case SL_OPCODE_WLAN_STA_DISCONNECTED: { - slPeerInfoAsyncResponse_t* pResp = (slPeerInfoAsyncResponse_t*)_SL_RESP_ARGS_START(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - memset(&wlanEvent.EventData.APModestaDisconnected,0,sizeof(slPeerInfoAsyncResponse_t)); - wlanEvent.Event = SL_WLAN_STA_DISCONNECTED_EVENT; - memcpy(wlanEvent.EventData.APModestaDisconnected.mac,pResp->mac, 6); - memcpy(wlanEvent.EventData.APModestaDisconnected.go_peer_device_name,pResp->go_peer_device_name,pResp->go_peer_device_name_len); - wlanEvent.EventData.APModestaDisconnected.go_peer_device_name_len = pResp->go_peer_device_name_len; - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&wlanEvent); - } - break; - - case SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE: { - _sl_HandleAsync_PingResponse((void *)g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - } - break; - - - default: - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - break; - } - } -} - - -/* ******************************************************************************/ -/* _SlDrvMsgReadCmdCtx */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvMsgReadCmdCtx(void) -{ - - /* after command response is received and isCmdRespWaited */ - /* flag is set FALSE, it is necessary to read out all */ - /* Async messages in Commands context, because ssiDma_IsrHandleSignalFromSlave */ - /* could have dispatched some Async messages to g_NwpIf.CmdSyncObj */ - /* after command response but before this response has been processed */ - /* by spi_singleRead and isCmdRespWaited was set FALSE. */ - - while (TRUE == g_pCB->IsCmdRespWaited) { - - if(_SL_PENDING_RX_MSG(g_pCB)) { - - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;/* buffer must be allocated by _SlDrvMsgRead */ - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = NULL; - g_pCB->FunctionParams.AsyncExt.RxMsgClass = (_SlRxMsgClass_e)(-1);/* init to illegal value and verify it's overwritten with the valid one */ - - VERIFY_RET_OK(_SlDrvMsgRead()); - g_pCB->RxDoneCnt++; - - if (CMD_RESP_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass) { - g_pCB->IsCmdRespWaited = FALSE; - - /* In case CmdResp has been read without waiting on CmdSyncObj - that */ - /* Sync object. That to prevent old signal to be processed. */ - _nonos.sl_SyncObjClear(&g_pCB->CmdSyncObj); - } else if (ASYNC_EVT_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass) { - /* If Async event has been read in CmdResp context, check whether */ - /* there is a handler for this event. If there is, spawn specific */ - /* handler. Otherwise free the event's buffer. */ - /* This way there will be no "dry shots" from CmdResp context to */ - /* temporary context, i.e less waste of CPU and faster buffer */ - /* release. */ - _SlAsyncEventGenericHandler(); - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL; -#else - free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); -#endif - } - } else { - /* CmdSyncObj will be signaled by IRQ */ - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->CmdSyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - } - } - - /* If there are more pending Rx Msgs after CmdResp is received, */ - /* that means that these are Async, Dummy or Read Data Msgs. */ - /* Spawn _SlDrvMsgReadSpawnCtx to trigger reading these messages from */ - /* Temporary context. */ - /* sl_Spawn is activated, using a different context */ - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - if(_SL_PENDING_RX_MSG(g_pCB)) { - _nonos._SlNonOsSpawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0); - } - - return SL_OS_RET_CODE_OK; -} - -/* ******************************************************************************/ -/* _SlDrvMsgReadSpawnCtx */ -/* ******************************************************************************/ - -_SlReturnVal_t cc3100_driver::_SlDrvMsgReadSpawnCtx_(void *pValue) -{ - -#ifdef SL_POLLING_MODE_USED - int16_t retCode = OSI_OK; - // for polling based systems - do { - retCode = sl_LockObjLock(&g_pCB->GlobalLockObj, 0); - if ( OSI_OK != retCode ) { - if (TRUE == g_pCB->IsCmdRespWaited) { - OSI_RET_OK_CHECK( sl_SyncObjSignal(&g_pCB->CmdSyncObj) ); - return SL_RET_CODE_OK; - } - } - - } while (OSI_OK != retCode); - -#else - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER) ); -#endif - - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;// buffer must be allocated by _SlDrvMsgRead - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = NULL; - g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS;// init to illegal value and verify it's overwritten with the valid one - - // Messages might have been read by CmdResp context. Therefore after - // getting LockObj, check again where the Pending Rx Msg is still present. - if(FALSE == (_SL_PENDING_RX_MSG(g_pCB))) { - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return SL_RET_CODE_OK; - } - - VERIFY_RET_OK(_SlDrvMsgRead()); - - g_pCB->RxDoneCnt++; - - switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) { - case ASYNC_EVT_CLASS: - // If got here and protected by LockObj a message is waiting - // to be read - VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf); - - _SlAsyncEventGenericHandler(); - -#if (SL_MEMORY_MGMT == SL_MEMORY_MGMT_STATIC) - g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL; -#else - sl_Free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf); -#endif - break; - case DUMMY_MSG_CLASS: - case RECV_RESP_CLASS: - // These types are legal in this context. Do nothing - break; - case CMD_RESP_CLASS: - // Command response is illegal in this context. - // No 'break' here: Assert! - default: - VERIFY_PROTOCOL(0); - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->GlobalLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - return(SL_RET_CODE_OK); -} - -/* ******************************************************************************/ -/* _SlDrvClassifyRxMsg */ -/* ******************************************************************************/ -void cc3100_driver::_SlDrvClassifyRxMsg(_SlOpcode_t Opcode) -{ - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = NULL; - - - /* Async event has received */ - if (0 == (SL_OPCODE_SYNC & Opcode)) { - if (SL_OPCODE_DEVICE_DEVICEASYNCDUMMY == Opcode) { - g_pCB->FunctionParams.AsyncExt.RxMsgClass = DUMMY_MSG_CLASS; - } else if ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode) ) { - g_pCB->FunctionParams.AsyncExt.RxMsgClass = RECV_RESP_CLASS; - } else { - g_pCB->FunctionParams.AsyncExt.RxMsgClass = ASYNC_EVT_CLASS; - - /* set silo handler */ - if (SL_OPCODE_SILO_DEVICE == (Opcode & SL_OPCODE_SILO_MASK)) { - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = (_SlSpawnEntryFunc_t)&_SlDrvDeviceEventHandler; - } else if (SL_OPCODE_SILO_WLAN == (Opcode & SL_OPCODE_SILO_MASK)) { -#ifdef sl_WlanEvtHdlr - - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = (_SlSpawnEntryFunc_t)&sl_WlanEvtHdlr; -#endif - } else if (SL_OPCODE_SILO_SOCKET == (Opcode & SL_OPCODE_SILO_MASK)) { - -#ifdef sl_SockEvtHdlr - - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = (_SlSpawnEntryFunc_t)&sl_SockEvtHdlr; -#endif - } else if (SL_OPCODE_SILO_NETAPP == (Opcode & SL_OPCODE_SILO_MASK)) { - - if ((SL_OPCODE_NETAPP_HTTPGETTOKENVALUE == Opcode) || (SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE == Opcode)) { - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = (_SlSpawnEntryFunc_t)&_SlDrvNetAppEventHandler; - } -#ifdef sl_NetAppEvtHdlr - else { - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = (_SlSpawnEntryFunc_t)&sl_NetAppEvtHdlr; - } -#endif - } - /* else if (SL_OPCODE_SILO_NVMEM == (Opcode & SL_OPCODE_SILO_MASK)) */ - /* { */ - /* } */ - /* else if (SL_OPCODE_SILO_NETCFG == (Opcode & SL_OPCODE_SILO_MASK)) */ - /* { */ - /* } */ - else { - SL_ERROR_TRACE2(MSG_311, "ASSERT: _SlDrvClassifyRxMsg : invalid opcode = 0x%x = %i", Opcode, Opcode); - } - } - } else { - /* These may be Command responses only */ - g_pCB->FunctionParams.AsyncExt.RxMsgClass = CMD_RESP_CLASS; - } -} - -/* ******************************************************************************/ -/* _SlDrvShiftDWord */ -/* ******************************************************************************/ -void cc3100_driver::_SlDrvShiftDWord(uint8_t *pBuf) -{ - uint8_t ShiftIdx; - for(ShiftIdx = 0; ShiftIdx< 7; ShiftIdx++) { - pBuf[ShiftIdx] = pBuf[ShiftIdx+1]; - } - pBuf[7] = 0; -} - -/* ******************************************************************************/ -/* _SlDrvRxHdrRead */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlDrvRxHdrRead(uint8_t *pBuf, uint8_t *pAlignSize) -{ - uint32_t SyncCnt = 0; - -#ifndef SL_IF_TYPE_UART - /* 1. Write CNYS pattern to NWP when working in SPI mode only */ - _spi.spi_Write(g_pCB->FD, (uint8_t *)&g_H2NCnysPattern.Short, SYNC_PATTERN_LEN); -#endif - - /* 2. Read 4 bytes (protocol aligned) */ - _spi.spi_Read(g_pCB->FD, &pBuf[0], 4); - _SL_DBG_SYNC_LOG(SyncCnt,pBuf); - - /* Wait for SYNC_PATTERN_LEN from the device */ - while ( ! N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) ) { - /* 3. Debug limit of scan */ - VERIFY_PROTOCOL(SyncCnt < SL_SYNC_SCAN_THRESHOLD); - - /* 4. Read next 4 bytes to Low 4 bytes of buffer */ - if(0 == (SyncCnt % (uint32_t)SYNC_PATTERN_LEN)) { - _spi.spi_Read(g_pCB->FD, &pBuf[4], 4); - _SL_DBG_SYNC_LOG(SyncCnt,pBuf); - } - - /* 5. Shift Buffer Up for checking if the sync is shifted */ - _SlDrvShiftDWord(pBuf); - - SyncCnt++; - } - - /* 5. Sync pattern found. If needed, complete number of read bytes to multiple of 4 (protocol align) */ - SyncCnt %= SYNC_PATTERN_LEN; - - if(SyncCnt > 0) { - *(uint32_t *)&pBuf[0] = *(uint32_t *)&pBuf[4]; - _spi.spi_Read(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN - SyncCnt], (uint16_t)SyncCnt); - } else { - _spi.spi_Read(g_pCB->FD, &pBuf[0], 4); - } - - /* 6. Scan for Double pattern. */ - while ( N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) ) { - _SL_DBG_CNT_INC(Work.DoubleSyncPattern); - _spi.spi_Read(g_pCB->FD, &pBuf[0], SYNC_PATTERN_LEN); - } - g_pCB->TxSeqNum++; - - /* 7. Here we've read Generic Header (4 bytes). Read the Resp Specific header (4 more bytes). */ - _spi.spi_Read(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN], _SL_RESP_SPEC_HDR_SIZE); - - /* 8. Here we've read the entire Resp Header. */ - /* Return number bytes needed to be sent after read for NWP Rx 4-byte alignment (protocol alignment) */ - *pAlignSize = (uint8_t)((SyncCnt > 0) ? (SYNC_PATTERN_LEN - SyncCnt) : 0); - - return SL_RET_CODE_OK; -} - -/* ***************************************************************************** */ -/* _SlDrvBasicCmd */ -/* ***************************************************************************** */ -typedef union { - _BasicResponse_t Rsp; -} _SlBasicCmdMsg_u; - -int16_t cc3100_driver::_SlDrvBasicCmd(_SlOpcode_t Opcode) -{ - _SlBasicCmdMsg_u Msg = {0}; - _SlCmdCtrl_t CmdCtrl; - - CmdCtrl.Opcode = Opcode; - CmdCtrl.TxDescLen = 0; - CmdCtrl.RxDescLen = sizeof(_BasicResponse_t); - - - VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL)); - - return (int16_t)Msg.Rsp.status; -} - -/* ***************************************************************************** */ -/* _SlDrvWaitForPoolObj */ -/* ***************************************************************************** */ -int16_t cc3100_driver::_SlDrvWaitForPoolObj(uint32_t ActionID, uint8_t SocketID) -{ - uint8_t CurrObjIndex = MAX_CONCURRENT_ACTIONS; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - /* Get free object */ - if (MAX_CONCURRENT_ACTIONS > g_pCB->FreePoolIdx) { - /* save the current obj index */ - CurrObjIndex = g_pCB->FreePoolIdx; - /* set the new free index */ - if (MAX_CONCURRENT_ACTIONS > g_pCB->ObjPool[CurrObjIndex].NextIndex) { - g_pCB->FreePoolIdx = g_pCB->ObjPool[CurrObjIndex].NextIndex; - } else { - /* No further free actions available */ - g_pCB->FreePoolIdx = MAX_CONCURRENT_ACTIONS; - } - } else { - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return CurrObjIndex; - } - g_pCB->ObjPool[CurrObjIndex].ActionID = (uint8_t)ActionID; - if (SL_MAX_SOCKETS > SocketID) { - g_pCB->ObjPool[CurrObjIndex].AdditionalData = SocketID; - } - /*In case this action is socket related, SocketID bit will be on - In case SocketID is set to SL_MAX_SOCKETS, the socket is not relevant to the action. In that case ActionID bit will be on */ - while ( ( (SL_MAX_SOCKETS > SocketID) && (g_pCB->ActiveActionsBitmap & (1<<SocketID)) ) || ( (g_pCB->ActiveActionsBitmap & (1<<ActionID)) && (SL_MAX_SOCKETS == SocketID) ) ) { - //action in progress - move to pending list - g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->PendingPoolIdx; - g_pCB->PendingPoolIdx = CurrObjIndex; - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - //wait for action to be free - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[CurrObjIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - //set params and move to active (remove from pending list at _SlDrvReleasePoolObj) - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - } - /*mark as active. Set socket as active if action is on socket, otherwise mark action as active*/ - if (SL_MAX_SOCKETS > SocketID) { - g_pCB->ActiveActionsBitmap |= (1<<SocketID); - } else { - g_pCB->ActiveActionsBitmap |= (1<<ActionID); - } - /* move to active list */ - g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->ActivePoolIdx; - g_pCB->ActivePoolIdx = CurrObjIndex; - /* unlock */ - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - return CurrObjIndex; -} - -/* ******************************************************************************/ -/* _SlDrvReleasePoolObj */ -/* ******************************************************************************/ -void cc3100_driver::_SlDrvReleasePoolObj(uint8_t ObjIdx) -{ - uint8_t PendingIndex; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - /* go over the pending list and release other pending action if needed */ - PendingIndex = g_pCB->PendingPoolIdx; - while(MAX_CONCURRENT_ACTIONS > PendingIndex) { - /* In case this action is socket related, SocketID is in use, otherwise will be set to SL_MAX_SOCKETS */ - if ( (g_pCB->ObjPool[PendingIndex].ActionID == g_pCB->ObjPool[ObjIdx].ActionID) && - ( (SL_MAX_SOCKETS == (g_pCB->ObjPool[PendingIndex].AdditionalData & BSD_SOCKET_ID_MASK)) || - ((SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK)) && ( (g_pCB->ObjPool[PendingIndex].AdditionalData & BSD_SOCKET_ID_MASK) == (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK) ))) ) { - /* remove from pending list */ - _SlRemoveFromList(&g_pCB->PendingPoolIdx, PendingIndex); - OSI_RET_OK_CHECK(_nonos.sl_SyncObjSignal(&g_pCB->ObjPool[PendingIndex].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE)); - break; - } - PendingIndex = g_pCB->ObjPool[PendingIndex].NextIndex; - } - - if (SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK)) { - /* unset socketID */ - g_pCB->ActiveActionsBitmap &= ~(1<<(g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK)); - } else { - /* unset actionID */ - g_pCB->ActiveActionsBitmap &= ~(1<<g_pCB->ObjPool[ObjIdx].ActionID); - } - - /* delete old data */ - g_pCB->ObjPool[ObjIdx].pRespArgs = NULL; - g_pCB->ObjPool[ObjIdx].ActionID = 0; - g_pCB->ObjPool[ObjIdx].AdditionalData = SL_MAX_SOCKETS; - - /* remove from active list */ - _SlRemoveFromList(&g_pCB->ActivePoolIdx, ObjIdx); - /* move to free list */ - g_pCB->ObjPool[ObjIdx].NextIndex = g_pCB->FreePoolIdx; - g_pCB->FreePoolIdx = ObjIdx; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); -} - - - -/* ******************************************************************************/ -/* _SlDrvObjInit */ -/* ******************************************************************************/ -void cc3100_driver::_SlDrvObjInit(void) -{ - uint8_t Idx; - - memset(&g_pCB->ObjPool[0],0,MAX_CONCURRENT_ACTIONS*sizeof(_SlPoolObj_t)); - /* place all Obj in the free list */ - g_pCB->FreePoolIdx = 0; - for (Idx = 0 ; Idx < MAX_CONCURRENT_ACTIONS ; Idx++) { - g_pCB->ObjPool[Idx].NextIndex = Idx + 1; - g_pCB->ObjPool[Idx].AdditionalData = SL_MAX_SOCKETS; - } - - g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS; - g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS; - -} - -/* ******************************************************************************/ -/* _SlDrvObjDeInit */ -/* ******************************************************************************/ -void cc3100_driver::_SlDrvObjDeInit(void) -{ - g_pCB->FreePoolIdx = 0; - g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS; - g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS; - -} - -/* ******************************************************************************/ -/* _SlRemoveFromList */ -/* ******************************************************************************/ -void cc3100_driver::_SlRemoveFromList(uint8_t *ListIndex, uint8_t ItemIndex) -{ - uint8_t Idx; - /* only one item in the list */ - if (MAX_CONCURRENT_ACTIONS == g_pCB->ObjPool[*ListIndex].NextIndex) { - *ListIndex = MAX_CONCURRENT_ACTIONS; - } - /* need to remove the first item in the list and therefore update the global which holds this index */ - else if (*ListIndex == ItemIndex) { - *ListIndex = g_pCB->ObjPool[ItemIndex].NextIndex; - } else { - Idx = *ListIndex; - while(MAX_CONCURRENT_ACTIONS > Idx) { - /* remove from list */ - if (g_pCB->ObjPool[Idx].NextIndex == ItemIndex) { - g_pCB->ObjPool[Idx].NextIndex = g_pCB->ObjPool[ItemIndex].NextIndex; - break; - } - Idx = g_pCB->ObjPool[Idx].NextIndex; - } - } -} - -/* ******************************************************************************/ -/* _SlFindAndSetActiveObj */ -/* ******************************************************************************/ -_SlReturnVal_t cc3100_driver::_SlFindAndSetActiveObj(_SlOpcode_t Opcode, uint8_t Sd) -{ - uint8_t ActiveIndex; - - ActiveIndex = g_pCB->ActivePoolIdx; - /* go over the active list if exist to find obj waiting for this Async event */ - while (MAX_CONCURRENT_ACTIONS > ActiveIndex) { - /* unset the Ipv4\IPv6 bit in the opcode if family bit was set */ - if (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) { - Opcode &= ~SL_OPCODE_IPV6; - } - - if ((g_pCB->ObjPool[ActiveIndex].ActionID == RECV_ID) && (Sd == g_pCB->ObjPool[ActiveIndex].AdditionalData) && - ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode) ) ) { - g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex; - return SL_RET_CODE_OK; - } - /* In case this action is socket related, SocketID is in use, otherwise will be set to SL_MAX_SOCKETS */ - if ( (_SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].ActionAsyncOpcode == Opcode) && - ( ((Sd == (g_pCB->ObjPool[ActiveIndex].AdditionalData & BSD_SOCKET_ID_MASK) ) && (SL_MAX_SOCKETS > Sd)) || (SL_MAX_SOCKETS == (g_pCB->ObjPool[ActiveIndex].AdditionalData & BSD_SOCKET_ID_MASK)) ) ) { - /* set handler */ - g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = _SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].AsyncEventHandler; - g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex; - return SL_RET_CODE_OK; - } - ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex; - } - - return SL_RET_CODE_SELF_ERROR; -} - -}//namespace mbed_cc3100 - -
--- a/simplelink/cc3100_driver.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/* - * driver.h - 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. - * -*/ - -#ifndef DRIVER_INT_H_ -#define DRIVER_INT_H_ - -#include "cc3100_simplelink.h" - -#include "cc3100_protocol.h" -#include "cc3100_nonos.h" -#include "cc3100_spi.h" -#include "cc3100_netapp.h" -#include "cc3100.h" - - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/* 2 LSB of the N2H_SYNC_PATTERN are for sequence number -only in SPI interface -support backward sync pattern */ -#define N2H_SYNC_PATTERN_SEQ_NUM_BITS ((uint32_t)0x00000003) /* Bits 0..1 - use the 2 LBS for seq num */ -#define N2H_SYNC_PATTERN_SEQ_NUM_EXISTS ((uint32_t)0x00000004) /* Bit 2 - sign that sequence number exists in the sync pattern */ -#define N2H_SYNC_PATTERN_MASK ((uint32_t)0xFFFFFFF8) /* Bits 3..31 - constant SYNC PATTERN */ -#define N2H_SYNC_SPI_BUGS_MASK ((uint32_t)0x7FFF7F7F) /* Bits 7,15,31 - ignore the SPI (8,16,32 bites bus) error bits */ -#define BUF_SYNC_SPIM(pBuf) ((*(uint32_t *)(pBuf)) & N2H_SYNC_SPI_BUGS_MASK) -#define N2H_SYNC_SPIM (N2H_SYNC_PATTERN & N2H_SYNC_SPI_BUGS_MASK) -#define N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum) ((N2H_SYNC_SPIM & N2H_SYNC_PATTERN_MASK) | N2H_SYNC_PATTERN_SEQ_NUM_EXISTS | ((TxSeqNum) & (N2H_SYNC_PATTERN_SEQ_NUM_BITS))) -#define MATCH_WOUT_SEQ_NUM(pBuf) ( BUF_SYNC_SPIM(pBuf) == N2H_SYNC_SPIM ) -#define MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ( BUF_SYNC_SPIM(pBuf) == (N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)) ) -#define N2H_SYNC_PATTERN_MATCH(pBuf, TxSeqNum) \ - ( \ - ( (*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ) ) || \ - ( !(*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WOUT_SEQ_NUM(pBuf ) ) ) \ - ) - -#define OPCODE(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Opcode) -#define RSP_PAYLOAD_LEN(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Len - _SL_RESP_SPEC_HDR_SIZE) -#define SD(_ptr) (((_SocketAddrResponse_u *)(_ptr))->IpV4.sd) -/* Actual size of Recv/Recvfrom response data */ -#define ACT_DATA_SIZE(_ptr) (((_SocketAddrResponse_u *)(_ptr))->IpV4.statusOrLen) - -#define _SL_PROTOCOL_ALIGN_SIZE(msgLen) (((msgLen)+3) & (~3)) -#define _SL_IS_PROTOCOL_ALIGNED_SIZE(msgLen) (!((msgLen) & 3)) -#define _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt) ((pCmdExt) ? \ - (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen) + _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayloadLen)) : \ - (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen))) - - -namespace mbed_cc3100 { - -class cc3100; - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ -//typedef void(*_SlSpawnEntryFunc_t)(void* pValue); - -typedef struct { - _SlOpcode_t Opcode; - _SlArgSize_t TxDescLen; - _SlArgSize_t RxDescLen; -} _SlCmdCtrl_t; - -typedef struct { - uint16_t TxPayloadLen; - uint16_t RxPayloadLen; - uint16_t ActualRxPayloadLen; - uint8_t *pTxPayload; - uint8_t *pRxPayload; -} _SlCmdExt_t; - - -typedef struct _SlArgsData_t { - uint8_t *pArgs; - uint8_t *pData; -} _SlArgsData_t; - - -typedef struct _SlPoolObj_t { - _SlSyncObj_t SyncObj; - uint8_t *pRespArgs; - uint8_t ActionID; - uint8_t AdditionalData; /* use for socketID and one bit which indicate supprt IPV6 or not (1=support, 0 otherwise) */ - uint8_t NextIndex; - -} _SlPoolObj_t; - - -typedef enum { - SOCKET_0, - SOCKET_1, - SOCKET_2, - SOCKET_3, - SOCKET_4, - SOCKET_5, - SOCKET_6, - SOCKET_7, - MAX_SOCKET_ENUM_IDX, - ACCEPT_ID = MAX_SOCKET_ENUM_IDX, - CONNECT_ID, - SELECT_ID, - GETHOSYBYNAME_ID, - GETHOSYBYSERVICE_ID, - PING_ID, - START_STOP_ID, - RECV_ID -} _SlActionID_e; - -typedef struct _SlActionLookup_t { - uint8_t ActionID; - uint16_t ActionAsyncOpcode; - _SlSpawnEntryFunc_t AsyncEventHandler; - -} _SlActionLookup_t; - - -typedef struct { - uint8_t TxPoolCnt; - _SlLockObj_t TxLockObj; - _SlSyncObj_t TxSyncObj; -} _SlFlowContCB_t; - -typedef enum { - RECV_RESP_CLASS, - CMD_RESP_CLASS, - ASYNC_EVT_CLASS, - DUMMY_MSG_CLASS -} _SlRxMsgClass_e; - -typedef struct { - uint8_t *pAsyncBuf; /* place to write pointer to buffer with CmdResp's Header + Arguments */ - uint8_t ActionIndex; - _SlSpawnEntryFunc_t AsyncEvtHandler; /* place to write pointer to AsyncEvent handler (calc-ed by Opcode) */ - _SlRxMsgClass_e RxMsgClass; /* type of Rx message */ -} AsyncExt_t; - -typedef struct { - _SlCmdCtrl_t *pCmdCtrl; - uint8_t *pTxRxDescBuff; - _SlCmdExt_t *pCmdExt; - AsyncExt_t AsyncExt; -} _SlFunctionParams_t; - -typedef void (*P_INIT_CALLBACK)(uint32_t Status); - -typedef struct { - _SlFd_t FD; - _SlLockObj_t GlobalLockObj; - _SlCommandHeader_t TempProtocolHeader; - P_INIT_CALLBACK pInitCallback; - - _SlPoolObj_t ObjPool[MAX_CONCURRENT_ACTIONS]; - uint8_t FreePoolIdx; - uint8_t PendingPoolIdx; - uint8_t ActivePoolIdx; - uint32_t ActiveActionsBitmap; - _SlLockObj_t ProtectionLockObj; - - _SlSyncObj_t CmdSyncObj; - uint8_t IsCmdRespWaited; - - _SlFlowContCB_t FlowContCB; - - uint8_t TxSeqNum; - volatile uint8_t RxIrqCnt; - uint8_t RxDoneCnt; - uint8_t SocketNonBlocking; - uint8_t SocketTXFailure; - uint8_t RelayFlagsViaRxPayload; - /* for stack reduction the parameters are globals */ - _SlFunctionParams_t FunctionParams; - -} _SlDriverCb_t; - -extern _SlDriverCb_t* g_pCB; -typedef uint8_t _SlSd_t; - -class cc3100_driver -{ - -public: - - cc3100_driver(cc3100_nonos &nonos, cc3100_netapp &netapp, cc3100_flowcont &flowcont, cc3100_spi &spi); - - ~cc3100_driver(); - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - typedef _SlDriverCb_t pDriver; - - bool _SL_PENDING_RX_MSG(pDriver* pDriverCB); - - void _SlDrvDriverCBInit(void); - - void _SlDrvDriverCBDeinit(void); - - void _SlDrvRxIrqHandler(void *pValue); - - _SlReturnVal_t _SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt); - - _SlReturnVal_t _SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt); - - _SlReturnVal_t _SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt); - - _SlReturnVal_t _SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt); - - int16_t _SlDrvBasicCmd(_SlOpcode_t Opcode); - - int16_t _SlDrvWaitForPoolObj(uint32_t ActionID, uint8_t SocketID); - - void _SlDrvReleasePoolObj(uint8_t pObj); - - void _SlDrvObjInit(void); - - _SlReturnVal_t _SlDrvMsgRead(void); - - _SlReturnVal_t _SlDrvMsgWrite(void); - - _SlReturnVal_t _SlDrvMsgReadCmdCtx(void); - - _SlReturnVal_t _SlDrvMsgReadSpawnCtx_(void *pValue); - - void _SlDrvClassifyRxMsg(_SlOpcode_t Opcode ); - - _SlReturnVal_t _SlDrvRxHdrRead(uint8_t *pBuf, uint8_t *pAlignSize); - - void _SlDrvShiftDWord(uint8_t *pBuf); - - void _SlAsyncEventGenericHandler(void); - - void _SlDrvObjDeInit(void); - - void _SlRemoveFromList(uint8_t* ListIndex, uint8_t ItemIndex); - - _SlReturnVal_t _SlFindAndSetActiveObj(_SlOpcode_t Opcode, uint8_t Sd); - -private: - - cc3100_nonos &_nonos; - cc3100_netapp &_netapp; - cc3100_flowcont &_flowcont; - cc3100_spi &_spi; - -};//class - -}//namespace mbed_cc3100 - -#endif /* __DRIVER_INT_H__ */ -
--- a/simplelink/cc3100_fs.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,397 +0,0 @@ -/* - * fs.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_fs.h" - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ -#define sl_min(a,b) (((a) < (b)) ? (a) : (b)) -#define MAX_NVMEM_CHUNK_SIZE 1460 - -namespace mbed_cc3100 { - -cc3100_fs::cc3100_fs(cc3100_driver &driver) - : _driver(driver) -{ - -} - -cc3100_fs::~cc3100_fs() -{ - -} - - -/*****************************************************************************/ -/* Internal functions */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* _sl_Strlen */ -/*****************************************************************************/ -uint16_t cc3100_fs::_sl_Strlen(const uint8_t *buffer) -{ - uint16_t len = 0; - if( buffer != NULL ) { - while(*buffer++) len++; - } - return len; -} - -/*****************************************************************************/ -/* _sl_GetCreateFsMode */ -/*****************************************************************************/ -uint32_t cc3100_fs::_sl_GetCreateFsMode(uint32_t maxSizeInBytes,uint32_t accessFlags) -{ - uint32_t granIdx = 0; - uint32_t granNum = 0; - uint32_t granTable[_FS_MAX_MODE_SIZE_GRAN] = {256,1024,4096,16384,65536}; - for(granIdx= _FS_MODE_SIZE_GRAN_256B ; granIdx< _FS_MAX_MODE_SIZE_GRAN; granIdx++) { - if( granTable[granIdx]*255 >= maxSizeInBytes ) - break; - } - granNum = maxSizeInBytes/granTable[granIdx]; - if( maxSizeInBytes % granTable[granIdx] != 0 ) - granNum++; - - return _FS_MODE(_FS_MODE_OPEN_WRITE_CREATE_IF_NOT_EXIST, granIdx, granNum, accessFlags); -} - - -/*****************************************************************************/ -/* API functions */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* sl_FsOpen */ -/*****************************************************************************/ -typedef union { - _FsOpenCommand_t Cmd; - _FsOpenResponse_t Rsp; -} _SlFsOpenMsg_u; - -const _SlCmdCtrl_t _SlFsOpenCmdCtrl = { - SL_OPCODE_NVMEM_FILEOPEN, - sizeof(_FsOpenCommand_t), - sizeof(_FsOpenResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_FsOpen) -int32_t cc3100_fs::sl_FsOpen(uint8_t *pFileName,uint32_t AccessModeAndMaxSize, uint32_t *pToken,int32_t *pFileHandle) -{ - _SlReturnVal_t RetVal; - _SlFsOpenMsg_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); // add 4: 1 for NULL and the 3 for align - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = pFileName; - CmdExt.pRxPayload = NULL; - - Msg.Cmd.Mode = AccessModeAndMaxSize; - - if(pToken != NULL) { - Msg.Cmd.Token = *pToken; - } else { - Msg.Cmd.Token = 0; - } - - RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsOpenCmdCtrl, &Msg, &CmdExt); - *pFileHandle = Msg.Rsp.FileHandle; - if (pToken != NULL) { - *pToken = Msg.Rsp.Token; - } - - /* in case of an error, return the erros file handler as an error code */ - if( *pFileHandle < 0 ) { - return *pFileHandle; - } - return (int32_t)RetVal; -} -#endif - -/*****************************************************************************/ -/* sl_FsClose */ -/*****************************************************************************/ -typedef union { - _FsCloseCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlFsCloseMsg_u; - -const _SlCmdCtrl_t _SlFsCloseCmdCtrl = { - SL_OPCODE_NVMEM_FILECLOSE, - sizeof(_FsCloseCommand_t), - sizeof(_FsCloseResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_FsClose) -int16_t cc3100_fs::sl_FsClose(int32_t FileHdl, uint8_t* pCeritificateFileName,uint8_t* pSignature ,uint32_t SignatureLen) -{ - _SlFsCloseMsg_u Msg = {0}; - _SlCmdExt_t ExtCtrl; - - Msg.Cmd.FileHandle = FileHdl; - if( pCeritificateFileName != NULL ) { - Msg.Cmd.CertificFileNameLength = (_sl_Strlen(pCeritificateFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */ - } - Msg.Cmd.SignatureLen = SignatureLen; - - ExtCtrl.TxPayloadLen = ((SignatureLen+3) & (~3)); /* align */ - ExtCtrl.pTxPayload = pSignature; - ExtCtrl.RxPayloadLen = (uint16_t)Msg.Cmd.CertificFileNameLength; - ExtCtrl.pRxPayload = pCeritificateFileName; /* Add signature */ - - if(ExtCtrl.pRxPayload != NULL && ExtCtrl.RxPayloadLen != 0) { - g_pCB->RelayFlagsViaRxPayload = TRUE; - } - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsCloseCmdCtrl, &Msg, &ExtCtrl)); - - return (int16_t)((int16_t)Msg.Rsp.status); -} -#endif - - -/*****************************************************************************/ -/* sl_FsRead */ -/*****************************************************************************/ -typedef union { - _FsReadCommand_t Cmd; - _FsReadResponse_t Rsp; -} _SlFsReadMsg_u; - -const _SlCmdCtrl_t _SlFsReadCmdCtrl = { - SL_OPCODE_NVMEM_FILEREADCOMMAND, - sizeof(_FsReadCommand_t), - sizeof(_FsReadResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_FsRead) -int32_t cc3100_fs::sl_FsRead(int32_t FileHdl, uint32_t Offset, uint8_t* pData, uint32_t Len) -{ - _SlFsReadMsg_u Msg; - _SlCmdExt_t ExtCtrl; - uint16_t ChunkLen; - _SlReturnVal_t RetVal =0; - int32_t RetCount = 0; - - ExtCtrl.TxPayloadLen = 0; - ExtCtrl.pTxPayload = NULL; - - ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len); - ExtCtrl.RxPayloadLen = ChunkLen; - ExtCtrl.pRxPayload = (uint8_t *)(pData); - Msg.Cmd.Offset = Offset; - Msg.Cmd.Len = ChunkLen; - Msg.Cmd.FileHandle = FileHdl; - do { - RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsReadCmdCtrl, &Msg, &ExtCtrl); - if(SL_OS_RET_CODE_OK == RetVal) { - if( Msg.Rsp.status < 0) { - if( RetCount > 0) { - return RetCount; - } else { - return Msg.Rsp.status; - } - } - RetCount += (int32_t)Msg.Rsp.status; - Len -= ChunkLen; - Offset += ChunkLen; - Msg.Cmd.Offset = Offset; - ExtCtrl.pRxPayload += ChunkLen; - ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len); - ExtCtrl.RxPayloadLen = ChunkLen; - Msg.Cmd.Len = ChunkLen; - Msg.Cmd.FileHandle = FileHdl; - } else { - return RetVal; - } - } while(ChunkLen > 0); - - return (int32_t)RetCount; -} -#endif - -/*****************************************************************************/ -/* sl_FsWrite */ -/*****************************************************************************/ -typedef union { - _FsWriteCommand_t Cmd; - _FsWriteResponse_t Rsp; -} _SlFsWriteMsg_u; - -const _SlCmdCtrl_t _SlFsWriteCmdCtrl = { - SL_OPCODE_NVMEM_FILEWRITECOMMAND, - sizeof(_FsWriteCommand_t), - sizeof(_FsWriteResponse_t) -}; - - -#if _SL_INCLUDE_FUNC(sl_FsWrite) -int32_t cc3100_fs::sl_FsWrite(int32_t FileHdl, uint32_t Offset, uint8_t* pData, uint32_t Len) -{ - _SlFsWriteMsg_u Msg; - _SlCmdExt_t ExtCtrl; - uint16_t ChunkLen; - _SlReturnVal_t RetVal; - int32_t RetCount = 0; - - ExtCtrl.RxPayloadLen = 0; - ExtCtrl.pRxPayload = NULL; - - ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len); - ExtCtrl.TxPayloadLen = ChunkLen; - ExtCtrl.pTxPayload = (uint8_t *)(pData); - Msg.Cmd.Offset = Offset; - Msg.Cmd.Len = ChunkLen; - Msg.Cmd.FileHandle = FileHdl; - - do { - - RetVal = _driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsWriteCmdCtrl, &Msg, &ExtCtrl); - if(SL_OS_RET_CODE_OK == RetVal) { - if( Msg.Rsp.status < 0) { - if( RetCount > 0) { - return RetCount; - } else { - return Msg.Rsp.status; - } - } - - RetCount += (int32_t)Msg.Rsp.status; - Len -= ChunkLen; - Offset += ChunkLen; - Msg.Cmd.Offset = Offset; - ExtCtrl.pTxPayload += ChunkLen; - ChunkLen = (uint16_t)sl_min(MAX_NVMEM_CHUNK_SIZE,Len); - ExtCtrl.TxPayloadLen = ChunkLen; - Msg.Cmd.Len = ChunkLen; - Msg.Cmd.FileHandle = FileHdl; - } else { - return RetVal; - } - } while(ChunkLen > 0); - - return (int32_t)RetCount; -} -#endif - -/*****************************************************************************/ -/* sl_FsGetInfo */ -/*****************************************************************************/ -typedef union { - _FsGetInfoCommand_t Cmd; - _FsGetInfoResponse_t Rsp; -} _SlFsGetInfoMsg_u; - -const _SlCmdCtrl_t _SlFsGetInfoCmdCtrl = { - SL_OPCODE_NVMEM_FILEGETINFOCOMMAND, - sizeof(_FsGetInfoCommand_t), - sizeof(_FsGetInfoResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_FsGetInfo) -int16_t cc3100_fs::sl_FsGetInfo(uint8_t *pFileName,uint32_t Token,SlFsFileInfo_t* pFsFileInfo) -{ - _SlFsGetInfoMsg_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */ - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = pFileName; - CmdExt.pRxPayload = NULL; - Msg.Cmd.Token = Token; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsGetInfoCmdCtrl, &Msg, &CmdExt)); - - pFsFileInfo->flags = Msg.Rsp.flags; - pFsFileInfo->FileLen = Msg.Rsp.FileLen; - pFsFileInfo->AllocatedLen = Msg.Rsp.AllocatedLen; - pFsFileInfo->Token[0] = Msg.Rsp.Token[0]; - pFsFileInfo->Token[1] = Msg.Rsp.Token[1]; - pFsFileInfo->Token[2] = Msg.Rsp.Token[2]; - pFsFileInfo->Token[3] = Msg.Rsp.Token[3]; - return (int16_t)((int16_t)Msg.Rsp.Status); -} -#endif - -/*****************************************************************************/ -/* sl_FsDel */ -/*****************************************************************************/ -typedef union { - _FsDeleteCommand_t Cmd; - _FsDeleteResponse_t Rsp; -} _SlFsDeleteMsg_u; - -const _SlCmdCtrl_t _SlFsDeleteCmdCtrl = { - SL_OPCODE_NVMEM_FILEDELCOMMAND, - sizeof(_FsDeleteCommand_t), - sizeof(_FsDeleteResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_FsDel) -int16_t cc3100_fs::sl_FsDel(uint8_t *pFileName,uint32_t Token) -{ - _SlFsDeleteMsg_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (_sl_Strlen(pFileName)+4) & (~3); /* add 4: 1 for NULL and the 3 for align */ - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = pFileName; - CmdExt.pRxPayload = NULL; - Msg.Cmd.Token = Token; - - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlFsDeleteCmdCtrl, &Msg, &CmdExt)); - - return (int16_t)((int16_t)Msg.Rsp.status); -} -#endif - -}//namespace mbed_cc3100 - -
--- a/simplelink/cc3100_fs.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,392 +0,0 @@ -/* - * fs.h - 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. - * -*/ - -#ifndef FS_H_ -#define FS_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ - -#include "cc3100_simplelink.h" - -/*! - - \addtogroup FileSystem - @{ - -*/ - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/* FS error codes */ -#define SL_FS_OK (0) -#define SL_FS_ERR_EMPTY_SFLASH (-67) -#define SL_FS_ERR_FILE_IS_NOT_SECURE_AND_SIGN (-66) -#define SL_FS_ERASING_FLASH (-65) -#define SL_FS_FILE_HAS_NOT_BEEN_CLOSE_CORRECTLY (-64) -#define SL_FS_WRONG_SIGNATURE (-63) -#define SL_FS_WRONG_SIGNATURE_OR_CERTIFIC_NAME_LENGTH (-62) -#define SL_FS_NOT_16_ALIGNED (-61) -#define SL_FS_CERT_CHAIN_ERROR (-60) -#define SL_FS_FILE_NAME_EXIST (-59) -#define SL_FS_SECURITY_BUF_ALREADY_ALLOC (-58) -#define SL_FS_SECURE_FILE_MUST_BE_COMMIT (-57) -#define SL_FS_ERR_INCORRECT_OFFSET_ALIGNMENT (-56) -#define SL_FS_ERR_FAILED_READ_NVMEM_HEADER (-55) -#define SL_FS_WRONG_FILE_NAME (-54) -#define SL_FS_FILE_SYSTEM_IS_LOCKED (-53) -#define SL_FS_SECURITY_ALLERT (-52) -#define SL_FS_FILE_UNVALID_FILE_SIZE (-51) -#define SL_FS_ERR_TOKEN_IS_NOT_VALID (-50) -#define SL_FS_NO_DEVICE_IS_LOADED (-49) -#define SL_FS_DATA_ADDRESS_SHOUD_BE_IN_DATA_RAM (-48) -#define SL_FS_DATA_IS_NOT_ALIGNED (-47) -#define SL_FS_ERR_OVERLAP_DETECTION_THRESHHOLD (-46) -#define SL_FS_FILE_HAS_RESERVED_NV_INDEX (-45) -#define SL_FS_ERR_MAX_FS_FILES_IS_LARGER (-44) -#define SL_FS_ERR_MAX_FS_FILES_IS_SMALLER (-43) -#define SL_FS_FILE_MAX_SIZE_EXCEEDED (-42) -#define SL_FS_INVALID_BUFFER_FOR_READ (-41) -#define SL_FS_INVALID_BUFFER_FOR_WRITE (-40) -#define SL_FS_ERR_FILE_IMAGE_IS_CORRUPTED (-39) -#define SL_FS_ERR_SIZE_OF_FILE_EXT_EXCEEDED (-38) -#define SL_FS_WARNING_FILE_NAME_NOT_KEPT (-37) -#define SL_FS_ERR_DEVICE_IS_NOT_FORMATTED (-36) -#define SL_FS_ERR_FAILED_WRITE_NVMEM_HEADER (-35) -#define SL_FS_ERR_NO_AVAILABLE_NV_INDEX (-34) -#define SL_FS_ERR_FAILED_TO_ALLOCATE_MEM (-33) -#define SL_FS_ERR_FAILED_TO_READ_INTEGRITY_HEADER_2 (-32) -#define SL_FS_ERR_FAILED_TO_READ_INTEGRITY_HEADER_1 (-31) -#define SL_FS_ERR_NO_AVAILABLE_BLOCKS (-30) -#define SL_FS_ERR_FILE_MAX_SIZE_BIGGER_THAN_EXISTING_FILE (-29) -#define SL_FS_ERR_FILE_EXISTS_ON_DIFFERENT_DEVICE_ID (-28) -#define SL_FS_ERR_INVALID_ACCESS_TYPE (-27) -#define SL_FS_ERR_FILE_ALREADY_EXISTS (-26) -#define SL_FS_ERR_PROGRAM (-25) -#define SL_FS_ERR_NO_ENTRIES_AVAILABLE (-24) -#define SL_FS_ERR_FILE_ACCESS_IS_DIFFERENT (-23) -#define SL_FS_ERR_BAD_FILE_MODE (-22) -#define SL_FS_ERR_FAILED_READ_NVFILE (-21) -#define SL_FS_ERR_FAILED_INIT_STORAGE (-20) -#define SL_FS_ERR_CONTINUE_WRITE_MUST_BE_MOD_4 (-19) -#define SL_FS_ERR_FAILED_LOAD_FILE (-18) -#define SL_FS_ERR_INVALID_HANDLE (-17) -#define SL_FS_ERR_FAILED_TO_WRITE (-16) -#define SL_FS_ERR_OFFSET_OUT_OF_RANGE (-15) -#define SL_FS_ERR_ALLOC (-14) -#define SL_FS_ERR_READ_DATA_LENGTH (-13) -#define SL_FS_ERR_INVALID_FILE_ID (-12) -#define SL_FS_ERR_FILE_NOT_EXISTS (-11) -#define SL_FS_ERR_EMPTY_ERROR (-10) -#define SL_FS_ERR_INVALID_ARGS (-9) -#define SL_FS_ERR_FAILED_TO_CREATE_FILE (-8) -#define SL_FS_ERR_FS_ALREADY_LOADED (-7) -#define SL_FS_ERR_UNKNOWN (-6) -#define SL_FS_ERR_FAILED_TO_CREATE_LOCK_OBJ (-5) -#define SL_FS_ERR_DEVICE_NOT_LOADED (-4) -#define SL_FS_ERR_INVALID_MAGIC_NUM (-3) -#define SL_FS_ERR_FAILED_TO_READ (-2) -#define SL_FS_ERR_NOT_SUPPORTED (-1) -/* end of error codes */ - -#define _FS_MODE_ACCESS_RESERVED_OFFSET (24) -#define _FS_MODE_ACCESS_RESERVED_MASK (0xFF) -#define _FS_MODE_ACCESS_FLAGS_OFFSET (16) -#define _FS_MODE_ACCESS_FLAGS_MASK (0xFF) -#define _FS_MODE_ACCESS_OFFSET (12) -#define _FS_MODE_ACCESS_MASK (0xF) -#define _FS_MODE_OPEN_SIZE_GRAN_OFFSET (8) -#define _FS_MODE_OPEN_SIZE_GRAN_MASK (0xF) -#define _FS_MODE_OPEN_SIZE_OFFSET (0) -#define _FS_MODE_OPEN_SIZE_MASK (0xFF) -#define MAX_MODE_SIZE (0xFF) -#define _FS_MODE(Access, SizeGran, Size,Flags) (uint32_t)(((uint32_t)((Access) & _FS_MODE_ACCESS_MASK)<<_FS_MODE_ACCESS_OFFSET) | \ - ((uint32_t)((SizeGran) & _FS_MODE_OPEN_SIZE_GRAN_MASK)<<_FS_MODE_OPEN_SIZE_GRAN_OFFSET) | \ - ((uint32_t)((Size) & _FS_MODE_OPEN_SIZE_MASK)<<_FS_MODE_OPEN_SIZE_OFFSET) | \ - ((uint32_t)((Flags) & _FS_MODE_ACCESS_FLAGS_MASK)<<_FS_MODE_ACCESS_FLAGS_OFFSET)) - - -/* sl_FsOpen options */ -/* Open for Read */ -#define FS_MODE_OPEN_READ _FS_MODE(_FS_MODE_OPEN_READ,0,0,0) -/* Open for Write (in case file exist) */ -#define FS_MODE_OPEN_WRITE _FS_MODE(_FS_MODE_OPEN_WRITE,0,0,0) -/* Open for Creating a new file */ -#define FS_MODE_OPEN_CREATE(maxSizeInBytes,accessModeFlags) _sl_GetCreateFsMode(maxSizeInBytes,accessModeFlags) - -namespace mbed_cc3100 { - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ -typedef struct { - uint16_t flags; - uint32_t FileLen; - uint32_t AllocatedLen; - uint32_t Token[4]; -} SlFsFileInfo_t; - -typedef enum { - _FS_MODE_OPEN_READ = 0, - _FS_MODE_OPEN_WRITE, - _FS_MODE_OPEN_CREATE, - _FS_MODE_OPEN_WRITE_CREATE_IF_NOT_EXIST -} SlFsFileOpenAccessType_e; - -typedef enum { - _FS_FILE_OPEN_FLAG_COMMIT = 0x1, /* MIRROR - for fail safe */ - _FS_FILE_OPEN_FLAG_SECURE = 0x2, /* SECURE */ - _FS_FILE_OPEN_FLAG_NO_SIGNATURE_TEST = 0x4, /* Relevant to secure file only */ - _FS_FILE_OPEN_FLAG_STATIC = 0x8, /* Relevant to secure file only */ - _FS_FILE_OPEN_FLAG_VENDOR = 0x10, /* Relevant to secure file only */ - _FS_FILE_PUBLIC_WRITE= 0x20, /* Relevant to secure file only, the file can be opened for write without Token */ - _FS_FILE_PUBLIC_READ = 0x40 /* Relevant to secure file only, the file can be opened for read without Token */ -} SlFileOpenFlags_e; - -typedef enum { - _FS_MODE_SIZE_GRAN_256B = 0, /* MAX_SIZE = 64K */ - _FS_MODE_SIZE_GRAN_1KB, /* MAX_SIZE = 256K */ - _FS_MODE_SIZE_GRAN_4KB, /* MAX_SZIE = 1M */ - _FS_MODE_SIZE_GRAN_16KB, /* MAX_SIZE = 4M */ - _FS_MODE_SIZE_GRAN_64KB, /* MAX_SIZE = 16M */ - _FS_MAX_MODE_SIZE_GRAN -} _SlFsFileOpenMaxSizeGran_e; - -class cc3100_driver; - -class cc3100_fs -{ - -public: - - cc3100_fs(cc3100_driver &driver); - - ~cc3100_fs(); - - /*****************************************************************************/ - /* Internal Function prototypes */ - /*****************************************************************************/ - uint32_t _sl_GetCreateFsMode(uint32_t maxSizeInBytes,uint32_t accessFlags); - uint16_t _sl_Strlen(const uint8_t *buffer); - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - /*! - \brief open file for read or write from/to storage device - - \param[in] pFileName File Name buffer pointer - \param[in] AccessModeAndMaxSize Options: As described below - \param[in] pToken Reserved for future use. Use NULL for this field - \param[out] pFileHandle Pointing on the file and used for read and write commands to the file - - AccessModeAndMaxSize possible input \n - FS_MODE_OPEN_READ - Read a file \n - FS_MODE_OPEN_WRITE - Open for write for an existing file \n - FS_MODE_OPEN_CREATE(maxSizeInBytes,accessModeFlags) - Open for creating a new file. Max file size is defined in bytes. \n - For optimal FS size, use max size in 4K-512 bytes steps (e.g. 3584,7680,117760) \n - Several access modes bits can be combined together from SlFileOpenFlags_e enum - - \return On success, zero is returned. On error, an error code is returned - - \sa sl_FsRead sl_FsWrite sl_FsClose - \note belongs to \ref basic_api - \warning - \par Example: - \code - char* DeviceFileName = "MyFile.txt"; - unsigned long MaxSize = 63 * 1024; //62.5K is max file size - long DeviceFileHandle = -1; - long RetVal; //negative retval is an error - unsigned long Offset = 0; - uint8_t InputBuffer[100]; - - // Create a file and write data. The file in this example is secured, without signature and with a fail safe commit - RetVal = sl_FsOpen((uint8_t *)DeviceFileName, - FS_MODE_OPEN_CREATE(MaxSize , _FS_FILE_OPEN_FLAG_NO_SIGNATURE_TEST | _FS_FILE_OPEN_FLAG_COMMIT ), - NULL, &DeviceFileHandle); - - Offset = 0; - //Preferred in secure file that the Offset and the length will be aligned to 16 bytes. - RetVal = sl_FsWrite( DeviceFileHandle, Offset, (uint8_t *)"HelloWorld", strlen("HelloWorld")); - - RetVal = sl_FsClose(DeviceFileHandle, NULL, NULL , 0); - - // open the same file for read, using the Token we got from the creation procedure above - RetVal = sl_FsOpen((uint8_t *)DeviceFileName, - FS_MODE_OPEN_READ, - NULL, &DeviceFileHandle); - - Offset = 0; - RetVal = sl_FsRead( DeviceFileHandle, Offset, (uint8_t *)InputBuffer, strlen("HelloWorld")); - - RetVal = sl_FsClose(DeviceFileHandle, NULL, NULL , 0); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsOpen) - int32_t sl_FsOpen(uint8_t *pFileName,uint32_t AccessModeAndMaxSize,uint32_t *pToken,int32_t *pFileHandle); -#endif - - /*! - \brief close file in storage device - - \param[in] FileHdl Pointer to the file (assigned from sl_FsOpen) - \param[in] pCeritificateFileName Reserved for future use. Use NULL. - \param[in] pSignature Reserved for future use. Use NULL. - \param[in] SignatureLen Reserved for future use. Use 0. - - - \return On success, zero is returned. On error, an error code is returned - - \sa sl_FsRead sl_FsWrite sl_FsOpen - \note Call the fs_Close with signature = 'A' signature len = 1 for activating an abort action - \warning - \par Example: - \code - sl_FsClose(FileHandle,0,0,0); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsClose) - int16_t sl_FsClose(int32_t FileHdl,uint8_t* pCeritificateFileName,uint8_t* pSignature,uint32_t SignatureLen); -#endif - - /*! - \brief Read block of data from a file in storage device - - \param[in] FileHdl Pointer to the file (assigned from sl_FsOpen) - \param[in] Offset Offset to specific read block - \param[out] pData Pointer for the received data - \param[in] Len Length of the received data - - \return On success, returns the number of read bytes. On error, negative number is returned - - \sa sl_FsClose sl_FsWrite sl_FsOpen - \note belongs to \ref basic_api - \warning - \par Example: - \code - Status = sl_FsRead(FileHandle, 0, &readBuff[0], readSize); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsRead) - int32_t sl_FsRead(int32_t FileHdl,uint32_t Offset ,uint8_t* pData,uint32_t Len); -#endif - - /*! - \brief write block of data to a file in storage device - - \param[in] FileHdl Pointer to the file (assigned from sl_FsOpen) - \param[in] Offset Offset to specific block to be written - \param[in] pData Pointer the transmitted data to the storage device - \param[in] Len Length of the transmitted data - - \return On success, returns the number of written bytes. On error, an error code is returned - - \sa - \note belongs to \ref basic_api - \warning - \par Example: - \code - Status = sl_FsWrite(FileHandle, 0, &buff[0], readSize); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsWrite) - int32_t sl_FsWrite(int32_t FileHdl,uint32_t Offset,uint8_t* pData,uint32_t Len); -#endif - - /*! - \brief get info on a file - - \param[in] pFileName File name - \param[in] Token Reserved for future use. Use 0 - \param[out] pFsFileInfo Returns the File's Information: flags,file size, allocated size and Tokens - - \return On success, zero is returned. On error, an error code is returned - - \sa sl_FsOpen - \note belongs to \ref basic_api - \warning - \par Example: - \code - Status = sl_FsGetInfo("FileName.html",0,&FsFileInfo); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsGetInfo) - int16_t sl_FsGetInfo(uint8_t *pFileName,uint32_t Token,SlFsFileInfo_t* pFsFileInfo); -#endif - - /*! - \brief Delete specific file from a storage or all files from a storage (format) - - \param[in] pFileName File Name - \param[in] Token Reserved for future use. Use 0 - \return On success, zero is returned. On error, an error code is returned - - \sa - \note belongs to \ref basic_api - \warning - \par Example: - \code - Status = sl_FsDel("FileName.html",0); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_FsDel) - int16_t sl_FsDel(uint8_t *pFileName,uint32_t Token); -#endif - -private: - - cc3100_driver &_driver; - -};//class - -}//namespace mbed_cc3100 - -/*! - - Close the Doxygen group. - @} - - */ - -#endif /* __FS_H__ */ - -
--- a/simplelink/cc3100_netapp.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,955 +0,0 @@ -/* - * netapp.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_netapp.h" -#include "fPtr_func.h" - -namespace mbed_cc3100 { - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ -const uint32_t NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT = ((uint32_t)0x1 << 31); - -#ifdef SL_TINY -const uint8_t NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH = 63; -#else -const uint8_t NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH = 255; -#endif - -cc3100_netapp::cc3100_netapp(cc3100_driver &driver, cc3100_nonos &nonos) - : _driver(driver), _nonos(nonos) -{ - -} - -cc3100_netapp::~cc3100_netapp() -{ - -} - - -/*****************************************************************************/ -/* API functions */ -/*****************************************************************************/ - -/***************************************************************************** - sl_NetAppStart -*****************************************************************************/ -typedef union { - _NetAppStartStopCommand_t Cmd; - _NetAppStartStopResponse_t Rsp; -} _SlNetAppStartStopMsg_u; - -const _SlCmdCtrl_t _SlNetAppStartCtrl = { - SL_OPCODE_NETAPP_START_COMMAND, - sizeof(_NetAppStartStopCommand_t), - sizeof(_NetAppStartStopResponse_t) -}; - -const _SlCmdCtrl_t _SlNetAppStopCtrl = { - SL_OPCODE_NETAPP_STOP_COMMAND, - sizeof(_NetAppStartStopCommand_t), - sizeof(_NetAppStartStopResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_NetAppStart) -int16_t cc3100_netapp::sl_NetAppStart(uint32_t AppBitMap) -{ - _SlNetAppStartStopMsg_u Msg; - Msg.Cmd.appId = AppBitMap; - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppStartCtrl, &Msg, NULL)); - - return Msg.Rsp.status; -} -#endif - -/***************************************************************************** - sl_NetAppStop -*****************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_NetAppStop) -int16_t cc3100_netapp::sl_NetAppStop(uint32_t AppBitMap) -{ - _SlNetAppStartStopMsg_u Msg; - Msg.Cmd.appId = AppBitMap; - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppStopCtrl, &Msg, NULL)); - - return Msg.Rsp.status; -} -#endif - - -/******************************************************************************/ -/* sl_NetAppGetServiceList */ -/******************************************************************************/ -typedef struct { - uint8_t IndexOffest; - uint8_t MaxServiceCount; - uint8_t Flags; - int8_t Padding; -} NetappGetServiceListCMD_t; - -typedef union { - NetappGetServiceListCMD_t Cmd; - _BasicResponse_t Rsp; -} _SlNetappGetServiceListMsg_u; - -const _SlCmdCtrl_t _SlGetServiceListeCtrl = { - SL_OPCODE_NETAPP_NETAPP_MDNS_LOOKUP_SERVICE, - sizeof(NetappGetServiceListCMD_t), - sizeof(_BasicResponse_t) -}; - - -#if _SL_INCLUDE_FUNC(sl_NetAppGetServiceList) -int16_t cc3100_netapp::sl_NetAppGetServiceList(uint8_t IndexOffest, - uint8_t MaxServiceCount, - uint8_t Flags, - int8_t *pBuffer, - uint32_t RxBufferLength - ) -{ - int32_t retVal= 0; - _SlNetappGetServiceListMsg_u Msg; - _SlCmdExt_t CmdExt; - uint16_t ServiceSize = 0; - uint16_t BufferSize = 0; - - /* - Calculate RX pBuffer size - WARNING: - if this size is BufferSize than 1480 error should be returned because there - is no place in the RX packet. - */ - switch(Flags) { - case SL_NET_APP_FULL_SERVICE_WITH_TEXT_IPV4_TYPE: - ServiceSize = sizeof(SlNetAppGetFullServiceWithTextIpv4List_t); - break; - - case SL_NET_APP_FULL_SERVICE_IPV4_TYPE: - ServiceSize = sizeof(SlNetAppGetFullServiceIpv4List_t); - break; - - case SL_NET_APP_SHORT_SERVICE_IPV4_TYPE: - ServiceSize = sizeof(SlNetAppGetShortServiceIpv4List_t); - break; - - default: - ServiceSize = sizeof(_BasicResponse_t); - break; - } - - - - BufferSize = MaxServiceCount * ServiceSize; - - /*Check the size of the requested services is smaller than size of the user buffer. - If not an error is returned in order to avoid overwriting memory. */ - if(RxBufferLength <= BufferSize) { - return SL_ERROR_NETAPP_RX_BUFFER_LENGTH_ERROR; - } - - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = BufferSize; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t *)pBuffer; - - Msg.Cmd.IndexOffest = IndexOffest; - Msg.Cmd.MaxServiceCount = MaxServiceCount; - Msg.Cmd.Flags = Flags; - Msg.Cmd.Padding = 0; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetServiceListeCtrl, &Msg, &CmdExt)); - retVal = Msg.Rsp.status; - - return (int16_t)retVal; -} - -#endif - -/*****************************************************************************/ -/* sl_mDNSRegisterService */ -/*****************************************************************************/ -/* - * The below struct depicts the constant parameters of the command/API RegisterService. - * - 1. ServiceLen - The length of the service should be smaller than NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - 2. TextLen - The length of the text should be smaller than NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - 3. port - The port on this target host. - 4. TTL - The TTL of the service - 5. Options - bitwise parameters: - bit 0 - is unique (means if the service needs to be unique) - bit 31 - for internal use if the service should be added or deleted (set means ADD). - bit 1-30 for future. - - NOTE: - - 1. There are another variable parameter is this API which is the service name and the text. - 2. According to now there is no warning and Async event to user on if the service is a unique. -* - */ - - -typedef struct { - uint8_t ServiceNameLen; - uint8_t TextLen; - uint16_t Port; - uint32_t TTL; - uint32_t Options; -} NetappMdnsSetService_t; - -typedef union { - NetappMdnsSetService_t Cmd; - _BasicResponse_t Rsp; -} _SlNetappMdnsRegisterServiceMsg_u; - -const _SlCmdCtrl_t _SlRegisterServiceCtrl = { - SL_OPCODE_NETAPP_MDNSREGISTERSERVICE, - sizeof(NetappMdnsSetService_t), - sizeof(_BasicResponse_t) -}; - - -/****************************************************************************** - - sl_NetAppMDNSRegisterService - - CALLER user from its host - - - DESCRIPTION: - Add/delete service - The function manipulates the command that register the service and call - to the NWP in order to add/delete the service to/from the mDNS package and to/from the DB. - - This register service is a service offered by the application. - This unregister service is a service offered by the application before. - - The service name should be full service name according to RFC - of the DNS-SD - means the value in name field in SRV answer. - - Example for service name: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - - If the option is_unique is set, mDNS probes the service name to make sure - it is unique before starting to announce the service on the network. - Instance is the instance portion of the service name. - - - - - PARAMETERS: - - The command is from constant parameters and variables parameters. - - Constant parameters are: - - ServiceLen - The length of the service. - TextLen - The length of the service should be smaller than 64. - port - The port on this target host. - TTL - The TTL of the service - Options - bitwise parameters: - bit 0 - is unique (means if the service needs to be unique) - bit 31 - for internal use if the service should be added or deleted (set means ADD). - bit 1-30 for future. - - The variables parameters are: - - Service name(full service name) - The service name. - Example for service name: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - - Text - The description of the service. - should be as mentioned in the RFC - (according to type of the service IPP,FTP...) - - NOTE - pay attention - - 1. Temporary - there is an allocation on stack of internal buffer. - Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - It means that the sum of the text length and service name length cannot be bigger than - NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - If it is - An error is returned. - - 2. According to now from certain constraints the variables parameters are set in the - attribute part (contain constant parameters) - - - - RETURNS: Status - the immediate response of the command status. - 0 means success. - - - -******************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_NetAppMDNSRegisterUnregisterService) -int16_t cc3100_netapp::sl_NetAppMDNSRegisterUnregisterService(const char* pServiceName, uint8_t ServiceNameLen, const char* pText, uint8_t TextLen, uint16_t Port, uint32_t TTL, uint32_t Options) -{ - - _SlNetappMdnsRegisterServiceMsg_u Msg; - _SlCmdExt_t CmdExt ; - unsigned char ServiceNameAndTextBuffer[NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH]; - unsigned char *TextPtr; - - /* - - NOTE - pay attention - - 1. Temporary - there is an allocation on stack of internal buffer. - Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - It means that the sum of the text length and service name length cannot be bigger than - NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - If it is - An error is returned. - - 2. According to now from certain constraints the variables parameters are set in the - attribute part (contain constant parameters) - - - */ - - /*build the attribute part of the command. - It contains the constant parameters of the command*/ - - Msg.Cmd.ServiceNameLen = ServiceNameLen; - Msg.Cmd.Options = Options; - Msg.Cmd.Port = Port; - Msg.Cmd.TextLen = TextLen; - Msg.Cmd.TTL = TTL; - - /*Build the payload part of the command - Copy the service name and text to one buffer. - NOTE - pay attention - The size of the service length + the text length should be smaller than 255, - Until the simplelink drive supports to variable length through SPI command. */ - 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*/ - return -1; - } - - memset(ServiceNameAndTextBuffer,0,NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH); - - - /*Copy the service name*/ - memcpy(ServiceNameAndTextBuffer, - pServiceName, - ServiceNameLen); - - if(TextLen > 0 ) { - - TextPtr = &ServiceNameAndTextBuffer[ServiceNameLen]; - /*Copy the text just after the service name*/ - memcpy(TextPtr, - pText, - TextLen); - - - } - - CmdExt.TxPayloadLen = (TextLen + ServiceNameLen); - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)ServiceNameAndTextBuffer; - CmdExt.pRxPayload = NULL; - - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlRegisterServiceCtrl, &Msg, &CmdExt)); - - return (int16_t)Msg.Rsp.status; - - -} -#endif - -/**********************************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_NetAppMDNSRegisterService) -int16_t cc3100_netapp::sl_NetAppMDNSRegisterService(const char* pServiceName, uint8_t ServiceNameLen, const char* pText, uint8_t TextLen, uint16_t Port, uint32_t TTL, uint32_t Options) -{ - - /* - - NOTE - pay attention - - 1. Temporary - there is an allocation on stack of internal buffer. - Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - It means that the sum of the text length and service name length cannot be bigger than - NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. - If it is - An error is returned. - - 2. According to now from certain constraints the variables parameters are set in the - attribute part (contain constant parameters) - - */ - - /*Set the add service bit in the options parameter. - In order not use different opcodes for the register service and unregister service - bit 31 in option is taken for this purpose. if it is set it means in NWP that the service should be added - if it is cleared it means that the service should be deleted and there is only meaning to pServiceName - and ServiceNameLen values. */ - Options |= NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT; - - return (sl_NetAppMDNSRegisterUnregisterService( pServiceName, ServiceNameLen, pText, TextLen, Port, TTL, Options)); - - -} -#endif -/**********************************************************************************************/ - - - -/**********************************************************************************************/ -#if _SL_INCLUDE_FUNC(sl_NetAppMDNSUnRegisterService) -int16_t cc3100_netapp::sl_NetAppMDNSUnRegisterService(const char* pServiceName, uint8_t ServiceNameLen) -{ - uint32_t Options = 0; - - /* - - NOTE - pay attention - - The size of the service length should be smaller than 255, - Until the simplelink drive supports to variable length through SPI command. - - - */ - - /*Clear the add service bit in the options parameter. - In order not use different opcodes for the register service and unregister service - bit 31 in option is taken for this purpose. if it is set it means in NWP that the service should be added - if it is cleared it means that the service should be deleted and there is only meaning to pServiceName - and ServiceNameLen values.*/ - - Options &= (~NETAPP_MDNS_OPTIONS_ADD_SERVICE_BIT); - - return (sl_NetAppMDNSRegisterUnregisterService(pServiceName, ServiceNameLen, NULL, 0, 0, 0, Options)); - - -} -#endif -/**********************************************************************************************/ - - - -/*****************************************************************************/ -/* sl_DnsGetHostByService */ -/*****************************************************************************/ -/* - * The below struct depicts the constant parameters of the command/API sl_DnsGetHostByService. - * - 1. ServiceLen - The length of the service should be smaller than 255. - 2. AddrLen - TIPv4 or IPv6 (SL_AF_INET , SL_AF_INET6). -* - */ - -typedef struct { - uint8_t ServiceLen; - uint8_t AddrLen; - uint16_t Padding; -} _GetHostByServiceCommand_t; - - - -/* - * The below structure depict the constant parameters that are returned in the Async event answer - * according to command/API sl_DnsGetHostByService for IPv4 and IPv6. - * - 1Status - The status of the response. - 2.Address - Contains the IP address of the service. - 3.Port - Contains the port of the service. - 4.TextLen - Contains the max length of the text that the user wants to get. - it means that if the test of service is bigger that its value than - the text is cut to inout_TextLen value. - Output: Contain the length of the text that is returned. Can be full text or part - of the text (see above). - -* - -typedef struct { - uint16_t Status; - uint16_t TextLen; - uint32_t Port; - uint32_t Address; -} _GetHostByServiceIPv4AsyncResponse_t; -*/ - -typedef struct { - uint16_t Status; - uint16_t TextLen; - uint32_t Port; - uint32_t Address[4]; -} _GetHostByServiceIPv6AsyncResponse_t; - - -typedef union { - _GetHostByServiceIPv4AsyncResponse_t IpV4; - _GetHostByServiceIPv6AsyncResponse_t IpV6; -} _GetHostByServiceAsyncResponseAttribute_u; - -typedef union { - _GetHostByServiceCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlGetHostByServiceMsg_u; - -const _SlCmdCtrl_t _SlGetHostByServiceCtrl = { - SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICE, - sizeof(_GetHostByServiceCommand_t), - sizeof(_BasicResponse_t) -}; - - - -/******************************************************************************/ - -#if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByService) -int32_t cc3100_netapp::sl_NetAppDnsGetHostByService(unsigned char *pServiceName, /* string containing all (or only part): name + subtype + service */ - uint8_t ServiceLen, - uint8_t Family, /* 4-IPv4 , 16-IPv6 */ - uint32_t pAddr[], - uint32_t *pPort, - uint16_t *pTextLen, /* in: max len , out: actual len */ - unsigned char *pText) -{ - - _SlGetHostByServiceMsg_u Msg; - _SlCmdExt_t CmdExt ; - _GetHostByServiceAsyncResponse_t AsyncRsp; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - /* - Note: - 1. The return's attributes are belonged to first service that is found. - It can be other services with the same service name will response to - the query. The results of these responses are saved in the peer cache of the NWP, and - should be read by another API. - - 2. Text length can be 120 bytes only - not more - It is because of constraints in the NWP on the buffer that is allocated for the Async event. - - 3.The API waits to Async event by blocking. It means that the API is finished only after an Async event - is sent by the NWP. - - 4.No rolling option!!! - only PTR type is sent. - - - */ - /*build the attribute part of the command. - It contains the constant parameters of the command */ - - Msg.Cmd.ServiceLen = ServiceLen; - Msg.Cmd.AddrLen = Family; - - /*Build the payload part of the command - Copy the service name and text to one buffer.*/ - CmdExt.TxPayloadLen = ServiceLen; - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)pServiceName; - CmdExt.pRxPayload = NULL; - - /*set pointers to the output parameters (the returned parameters). - This pointers are belonged to local struct that is set to global Async response parameter. - It is done in order not to run more than one sl_DnsGetHostByService at the same time. - The API should be run only if global parameter is pointed to NULL. */ - AsyncRsp.out_pText = pText; - AsyncRsp.inout_TextLen = (uint16_t* )pTextLen; - AsyncRsp.out_pPort = pPort; - AsyncRsp.out_pAddr = (uint32_t *)pAddr; - - - /*Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(GETHOSYBYSERVICE_ID,SL_MAX_SOCKETS); - - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - /* set bit to indicate IPv6 address is expected */ - if (SL_AF_INET6 == Family) { - g_pCB->ObjPool[ObjIdx].AdditionalData |= SL_NETAPP_FAMILY_MASK; - } - /* Send the command */ - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetHostByServiceCtrl, &Msg, &CmdExt)); - - - - /* If the immediate reponse is O.K. than wait for aSYNC event response. */ - if(SL_RET_CODE_OK == Msg.Rsp.status) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - - /* If we are - it means that Async event was sent. - The results are copied in the Async handle return functions */ - - Msg.Rsp.status = AsyncRsp.Status; - } - - _driver._SlDrvReleasePoolObj(ObjIdx); - return Msg.Rsp.status; -} -#endif - -/*****************************************************************************/ -/* _sl_HandleAsync_DnsGetHostByAddr */ -/*****************************************************************************/ -void cc3100_netapp::_sl_HandleAsync_DnsGetHostByAddr(void *pVoidBuf) -{ - SL_TRACE0(DBG_MSG, MSG_303, "STUB: _sl_HandleAsync_DnsGetHostByAddr not implemented yet!"); - return; -} - -/*****************************************************************************/ -/* sl_DnsGetHostByName */ -/*****************************************************************************/ -typedef union { - _GetHostByNameIPv4AsyncResponse_t IpV4; - _GetHostByNameIPv6AsyncResponse_t IpV6; -} _GetHostByNameAsyncResponse_u; - -typedef union { - _GetHostByNameCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlGetHostByNameMsg_u; - -const _SlCmdCtrl_t _SlGetHostByNameCtrl = { - SL_OPCODE_NETAPP_DNSGETHOSTBYNAME, - sizeof(_GetHostByNameCommand_t), - sizeof(_BasicResponse_t) -}; -#if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByName) -int16_t cc3100_netapp::sl_NetAppDnsGetHostByName(unsigned char * hostname, uint16_t usNameLen, uint32_t* out_ip_addr,uint8_t family) -{ - _SlGetHostByNameMsg_u Msg; - _SlCmdExt_t ExtCtrl; - _GetHostByNameAsyncResponse_u AsyncRsp; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - ExtCtrl.TxPayloadLen = usNameLen; - ExtCtrl.RxPayloadLen = 0; - ExtCtrl.pTxPayload = (unsigned char *)hostname; - ExtCtrl.pRxPayload = 0; - - Msg.Cmd.Len = usNameLen; - Msg.Cmd.family = family; - - /*Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(GETHOSYBYNAME_ID,SL_MAX_SOCKETS); - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - printf("SL_POOL_IS_EMPTY \r\n"); - return SL_POOL_IS_EMPTY; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - /*set bit to indicate IPv6 address is expected */ - if (SL_AF_INET6 == family) { - g_pCB->ObjPool[ObjIdx].AdditionalData |= SL_NETAPP_FAMILY_MASK; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetHostByNameCtrl, &Msg, &ExtCtrl)); - - if(SL_RET_CODE_OK == Msg.Rsp.status) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - Msg.Rsp.status = AsyncRsp.IpV4.status; - - if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status) { - memcpy((int8_t *)out_ip_addr, (signed char *)&AsyncRsp.IpV4.ip0, (SL_AF_INET == family) ? SL_IPV4_ADDRESS_SIZE : SL_IPV6_ADDRESS_SIZE); - } - } - _driver._SlDrvReleasePoolObj(ObjIdx); - return Msg.Rsp.status; -} -#endif - -void cc3100_netapp::CopyPingResultsToReport(_PingReportResponse_t *pResults,SlPingReport_t *pReport) -{ - pReport->PacketsSent = pResults->numSendsPings; - pReport->PacketsReceived = pResults->numSuccsessPings; - pReport->MinRoundTime = pResults->rttMin; - pReport->MaxRoundTime = pResults->rttMax; - pReport->AvgRoundTime = pResults->rttAvg; - pReport->TestTime = pResults->testTime; -} - -/*****************************************************************************/ -/* sl_PingStart */ -/*****************************************************************************/ -typedef union { - _PingStartCommand_t Cmd; - _PingReportResponse_t Rsp; -} _SlPingStartMsg_u; - - -typedef enum { - CMD_PING_TEST_RUNNING = 0, - CMD_PING_TEST_STOPPED -} _SlPingStatus_e; - -P_SL_DEV_PING_CALLBACK pPingCallBackFunc; - -#if _SL_INCLUDE_FUNC(sl_NetAppPingStart) -int16_t cc3100_netapp::sl_NetAppPingStart(SlPingStartCommand_t* pPingParams,uint8_t family, SlPingReport_t *pReport, const P_SL_DEV_PING_CALLBACK pPingCallback) -{ - - _SlCmdCtrl_t CmdCtrl = {0, sizeof(_PingStartCommand_t), sizeof(_BasicResponse_t)}; - _SlPingStartMsg_u Msg; - _PingReportResponse_t PingRsp; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - if( 0 == pPingParams->Ip ) { // stop any ongoing ping - return _driver._SlDrvBasicCmd(SL_OPCODE_NETAPP_PINGSTOP); - } - - if(SL_AF_INET == family) { - CmdCtrl.Opcode = SL_OPCODE_NETAPP_PINGSTART; - memcpy(&Msg.Cmd.ip0, &pPingParams->Ip, SL_IPV4_ADDRESS_SIZE); - } else { - CmdCtrl.Opcode = SL_OPCODE_NETAPP_PINGSTART_V6; - memcpy(&Msg.Cmd.ip0, &pPingParams->Ip, SL_IPV6_ADDRESS_SIZE); - } - - Msg.Cmd.pingIntervalTime = pPingParams->PingIntervalTime; - Msg.Cmd.PingSize = pPingParams->PingSize; - Msg.Cmd.pingRequestTimeout = pPingParams->PingRequestTimeout; - Msg.Cmd.totalNumberOfAttempts = pPingParams->TotalNumberOfAttempts; - Msg.Cmd.flags = pPingParams->Flags; - - if( pPingCallback ) { - pPingCallBackFunc = pPingCallback; - } else { - /*Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(PING_ID,SL_MAX_SOCKETS); - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - /* async response handler for non callback mode */ - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&PingRsp; - pPingCallBackFunc = NULL; - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - } - - - VERIFY_RET_OK(_driver._SlDrvCmdOp(&CmdCtrl, &Msg, NULL)); - /*send the command*/ - if(CMD_PING_TEST_RUNNING == (int16_t)Msg.Rsp.status || CMD_PING_TEST_STOPPED == (int16_t)Msg.Rsp.status ) { - /* block waiting for results if no callback function is used */ - if( NULL == pPingCallback ) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - if( SL_OS_RET_CODE_OK == (int16_t)PingRsp.status ) { - CopyPingResultsToReport(&PingRsp,pReport); - } - _driver._SlDrvReleasePoolObj(ObjIdx); - } - } else { - /* ping failure, no async response */ - if( NULL == pPingCallback ) { - _driver._SlDrvReleasePoolObj(ObjIdx); - } - } - - return Msg.Rsp.status; -} -#endif - -/*****************************************************************************/ -/* sl_NetAppSet */ -/*****************************************************************************/ -typedef union { - _NetAppSetGet_t Cmd; - _BasicResponse_t Rsp; -} _SlNetAppMsgSet_u; - -const _SlCmdCtrl_t _SlNetAppSetCmdCtrl = { - SL_OPCODE_NETAPP_NETAPPSET, - sizeof(_NetAppSetGet_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_NetAppSet) -int32_t cc3100_netapp::sl_NetAppSet(uint8_t AppId ,uint8_t Option,uint8_t OptionLen, uint8_t *pOptionValue) -{ - - _SlNetAppMsgSet_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (OptionLen+3) & (~3); - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)pOptionValue; - CmdExt.pRxPayload = NULL; - - - Msg.Cmd.AppId = AppId; - Msg.Cmd.ConfigLen = OptionLen; - Msg.Cmd.ConfigOpt = Option; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppSetCmdCtrl, &Msg, &CmdExt)); - - return (int16_t)Msg.Rsp.status; -} -#endif - -/*****************************************************************************/ -/* sl_NetAppSendTokenValue */ -/*****************************************************************************/ -typedef union { - sl_NetAppHttpServerSendToken_t Cmd; - _BasicResponse_t Rsp; -} _SlNetAppMsgSendTokenValue_u; - -const _SlCmdCtrl_t _SlNetAppSendTokenValueCmdCtrl = { - SL_OPCODE_NETAPP_HTTPSENDTOKENVALUE, - sizeof(sl_NetAppHttpServerSendToken_t), - sizeof(_BasicResponse_t) -}; - -uint16_t cc3100_netapp::sl_NetAppSendTokenValue(slHttpServerData_t * Token_value) -{ - - _SlNetAppMsgSendTokenValue_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = (Token_value->value_len+3) & (~3); - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *) Token_value->token_value; - CmdExt.pRxPayload = NULL; - - Msg.Cmd.token_value_len = Token_value->value_len; - Msg.Cmd.token_name_len = Token_value->name_len; - memcpy(&Msg.Cmd.token_name[0], Token_value->token_name, Token_value->name_len); - - - VERIFY_RET_OK(_driver._SlDrvCmdSend((_SlCmdCtrl_t *)&_SlNetAppSendTokenValueCmdCtrl, &Msg, &CmdExt)); - - return Msg.Rsp.status; -} - -/*****************************************************************************/ -/* sl_NetAppGet */ -/*****************************************************************************/ -typedef union { - _NetAppSetGet_t Cmd; - _NetAppSetGet_t Rsp; -} _SlNetAppMsgGet_u; - -const _SlCmdCtrl_t _SlNetAppGetCmdCtrl = { - SL_OPCODE_NETAPP_NETAPPGET, - sizeof(_NetAppSetGet_t), - sizeof(_NetAppSetGet_t) -}; - -#if _SL_INCLUDE_FUNC(sl_NetAppGet) -int32_t cc3100_netapp::sl_NetAppGet(uint8_t AppId, uint8_t Option,uint8_t *pOptionLen, uint8_t *pOptionValue) -{ - _SlNetAppMsgGet_u Msg; - _SlCmdExt_t CmdExt; - - if (*pOptionLen == 0) { - return SL_EZEROLEN; - } - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = *pOptionLen; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t *)pOptionValue; - CmdExt.ActualRxPayloadLen = 0; - - Msg.Cmd.AppId = AppId; - Msg.Cmd.ConfigOpt = Option; - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetAppGetCmdCtrl, &Msg, &CmdExt)); - - - if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) { - *pOptionLen = (uint8_t)CmdExt.RxPayloadLen; - return SL_ESMALLBUF; - } else { - *pOptionLen = (uint8_t)CmdExt.ActualRxPayloadLen; - } - - return (int16_t)Msg.Rsp.Status; -} -#endif - -cc3100_flowcont::cc3100_flowcont(cc3100_driver &driver, cc3100_nonos &nonos) - : _driver(driver), _nonos(nonos) -{ - -} - -cc3100_flowcont::~cc3100_flowcont() -{ - -} - -/*****************************************************************************/ -/* _SlDrvFlowContInit */ -/*****************************************************************************/ -void cc3100_flowcont::_SlDrvFlowContInit(void) -{ - g_pCB->FlowContCB.TxPoolCnt = FLOW_CONT_MIN; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj, "TxLockObj")); - - OSI_RET_OK_CHECK(_nonos.sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj, "TxSyncObj")); -} - -/*****************************************************************************/ -/* _SlDrvFlowContDeinit */ -/*****************************************************************************/ -void cc3100_flowcont::_SlDrvFlowContDeinit(void) -{ - g_pCB->FlowContCB.TxPoolCnt = 0; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj, 0)); - - OSI_RET_OK_CHECK(_nonos.sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj, 0)); -} - -}//namespace mbed_cc3100 - -
--- a/simplelink/cc3100_netapp.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1078 +0,0 @@ -/* - * netapp.h - 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. - * -*/ - -#ifndef NETAPP_H_ -#define NETAPP_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ - -#include "cc3100_simplelink.h" - -#include "cc3100_protocol.h" -#include "cc3100_nonos.h" - -namespace mbed_cc3100 { - -/*! - - \addtogroup netapp - @{ - -*/ - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/*ERROR code*/ -const int16_t SL_ERROR_NETAPP_RX_BUFFER_LENGTH_ERROR = (-230); - -/* Http Server interface */ -const uint8_t MAX_INPUT_STRING = (64); /* because of WPA */ - -const uint8_t MAX_AUTH_NAME_LEN = (20); -const uint8_t MAX_AUTH_PASSWORD_LEN = (20); -const uint8_t MAX_AUTH_REALM_LEN = (20); - -const uint8_t MAX_DEVICE_URN_LEN = (15+1); -const uint8_t MAX_DOMAIN_NAME_LEN = (24+1); - -const uint8_t MAX_ACTION_LEN = (30); -/* Important: in case the max len is changed, make sure the struct sl_NetAppHttpServerSendToken_t in protocol.h is padded correctly! */ -const uint8_t MAX_TOKEN_NAME_LEN = (20); -const uint8_t MAX_TOKEN_VALUE_LEN = MAX_INPUT_STRING; - -const int16_t NETAPP_MAX_SERVICE_TEXT_SIZE = (256); -const uint8_t NETAPP_MAX_SERVICE_NAME_SIZE = (60); -const uint8_t NETAPP_MAX_SERVICE_HOST_NAME_SIZE = (64); - - -/* Server Responses */ -const uint8_t SL_NETAPP_RESPONSE_NONE = (0); -const uint8_t SL_NETAPP_HTTPSETTOKENVALUE = (1); - -const uint8_t SL_NETAPP_FAMILY_MASK = (0x80); - -/* mDNS types */ -const uint32_t SL_NET_APP_MASK_IPP_TYPE_OF_SERVICE = (0x00000001); -const uint32_t SL_NET_APP_MASK_DEVICE_INFO_TYPE_OF_SERVICE = (0x00000002); -const uint32_t SL_NET_APP_MASK_HTTP_TYPE_OF_SERVICE = (0x00000004); -const uint32_t SL_NET_APP_MASK_HTTPS_TYPE_OF_SERVICE = (0x00000008); -const uint32_t SL_NET_APP_MASK_WORKSATION_TYPE_OF_SERVICE = (0x00000010); -const uint32_t SL_NET_APP_MASK_GUID_TYPE_OF_SERVICE = (0x00000020); -const uint32_t SL_NET_APP_MASK_H323_TYPE_OF_SERVICE = (0x00000040); -const uint32_t SL_NET_APP_MASK_NTP_TYPE_OF_SERVICE = (0x00000080); -const uint32_t SL_NET_APP_MASK_OBJECITVE_TYPE_OF_SERVICE = (0x00000100); -const uint32_t SL_NET_APP_MASK_RDP_TYPE_OF_SERVICE = (0x00000200); -const uint32_t SL_NET_APP_MASK_REMOTE_TYPE_OF_SERVICE = (0x00000400); -const uint32_t SL_NET_APP_MASK_RTSP_TYPE_OF_SERVICE = (0x00000800); -const uint32_t SL_NET_APP_MASK_SIP_TYPE_OF_SERVICE = (0x00001000); -const uint32_t SL_NET_APP_MASK_SMB_TYPE_OF_SERVICE = (0x00002000); -const uint32_t SL_NET_APP_MASK_SOAP_TYPE_OF_SERVICE = (0x00004000); -const uint32_t SL_NET_APP_MASK_SSH_TYPE_OF_SERVICE = (0x00008000); -const uint32_t SL_NET_APP_MASK_TELNET_TYPE_OF_SERVICE = (0x00010000); -const uint32_t SL_NET_APP_MASK_TFTP_TYPE_OF_SERVICE = (0x00020000); -const uint32_t SL_NET_APP_MASK_XMPP_CLIENT_TYPE_OF_SERVICE = (0x00040000); -const uint32_t SL_NET_APP_MASK_RAOP_TYPE_OF_SERVICE = (0x00080000); -const uint32_t SL_NET_APP_MASK_ALL_TYPE_OF_SERVICE = (0xFFFFFFFF); - -/********************************************************************************************************/ -/* sl_NetAppDnsGetHostByName error codes */ - -const int16_t SL_NET_APP_DNS_QUERY_NO_RESPONSE = (-159); /* DNS query failed, no response */ -const int16_t SL_NET_APP_DNS_NO_SERVER = (-161); /* No DNS server was specified */ -const int16_t SL_NET_APP_DNS_PARAM_ERROR = (-162); /* mDNS parameters error */ -const int16_t SL_NET_APP_DNS_QUERY_FAILED = (-163); /* DNS query failed; no DNS server sent an 'answer' */ -const int16_t SL_NET_APP_DNS_INTERNAL_1 = (-164); -const int16_t SL_NET_APP_DNS_INTERNAL_2 = (-165); -const int16_t SL_NET_APP_DNS_MALFORMED_PACKET = (-166); /* Improperly formed or corrupted DNS packet received */ -const int16_t SL_NET_APP_DNS_INTERNAL_3 = (-167); -const int16_t SL_NET_APP_DNS_INTERNAL_4 = (-168); -const int16_t SL_NET_APP_DNS_INTERNAL_5 = (-169); -const int16_t SL_NET_APP_DNS_INTERNAL_6 = (-170); -const int16_t SL_NET_APP_DNS_INTERNAL_7 = (-171); -const int16_t SL_NET_APP_DNS_INTERNAL_8 = (-172); -const int16_t SL_NET_APP_DNS_INTERNAL_9 = (-173); -const int16_t SL_NET_APP_DNS_MISMATCHED_RESPONSE = (-174); /* Server response type does not match the query request*/ -const int16_t SL_NET_APP_DNS_INTERNAL_10 = (-175); -const int16_t SL_NET_APP_DNS_INTERNAL_11 = (-176); -const int16_t SL_NET_APP_DNS_NO_ANSWER = (-177); /* No response for one-shot query */ -const int16_t SL_NET_APP_DNS_NO_KNOWN_ANSWER = (-178); /* No known answer for query */ -const int16_t SL_NET_APP_DNS_NAME_MISMATCH = (-179); /* Illegal service name according to the RFC */ -const int16_t SL_NET_APP_DNS_NOT_STARTED = (-180); /* mDNS is not running */ -const int16_t SL_NET_APP_DNS_HOST_NAME_ERROR = (-181); /* Host name error. Host name format is not allowed according to RFC 1033,1034,1035, 6763 */ -const int16_t SL_NET_APP_DNS_NO_MORE_ENTRIES = (-182); /* No more entries be found. */ - -const int16_t SL_NET_APP_DNS_MAX_SERVICES_ERROR = (-200); /* Maximum advertise services are already configured */ -const int16_t SL_NET_APP_DNS_IDENTICAL_SERVICES_ERROR = (-201); /* Trying to register a service that is already exists */ -const int16_t SL_NET_APP_DNS_NOT_EXISTED_SERVICE_ERROR = (-203); /* Trying to delete service that does not existed */ -const int16_t SL_NET_APP_DNS_ERROR_SERVICE_NAME_ERROR = (-204); /* Illegal service name according to the RFC */ -const int16_t SL_NET_APP_DNS_RX_PACKET_ALLOCATION_ERROR = (-205); /* Retry request */ -const int16_t SL_NET_APP_DNS_BUFFER_SIZE_ERROR = (-206); /* List size buffer is bigger than internally allowed in the NWP */ -const int16_t SL_NET_APP_DNS_NET_APP_SET_ERROR = (-207); /* Illegal length of one of the mDNS Set functions */ -const int16_t SL_NET_APP_DNS_GET_SERVICE_LIST_FLAG_ERROR = (-208); -const int16_t SL_NET_APP_DNS_NO_CONFIGURATION_ERROR = (-209); - -/* Set Dev name error codes (NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN) */ -const int16_t SL_ERROR_DEVICE_NAME_LEN_ERR = (-117); -const int16_t SL_ERROR_DEVICE_NAME_INVALID = (-118); -/* Set domain name error codes (NETAPP_SET_GET_DEV_CONF_OPT_DOMAIN_NAME) */ -const int16_t SL_ERROR_DOMAIN_NAME_LEN_ERR = (-119); -const int16_t SL_ERROR_DOMAIN_NAME_INVALID = (-120); - -/********************************************************************************************************/ - -/* NetApp application IDs */ -const uint8_t SL_NET_APP_HTTP_SERVER_ID = (1); -const uint8_t SL_NET_APP_DHCP_SERVER_ID = (2); -const uint8_t SL_NET_APP_MDNS_ID = (4); -const uint8_t SL_NET_APP_DNS_SERVER_ID = (8); -const uint8_t SL_NET_APP_DEVICE_CONFIG_ID = (16); -/* NetApp application set/get options */ -const uint8_t NETAPP_SET_DHCP_SRV_BASIC_OPT = (0); -/* HTTP server set/get options */ -const uint8_t NETAPP_SET_GET_HTTP_OPT_PORT_NUMBER = (0); -const uint8_t NETAPP_SET_GET_HTTP_OPT_AUTH_CHECK = (1); -const uint8_t NETAPP_SET_GET_HTTP_OPT_AUTH_NAME = (2); -const uint8_t NETAPP_SET_GET_HTTP_OPT_AUTH_PASSWORD = (3); -const uint8_t NETAPP_SET_GET_HTTP_OPT_AUTH_REALM = (4); -const uint8_t NETAPP_SET_GET_HTTP_OPT_ROM_PAGES_ACCESS = (5); - -const uint8_t NETAPP_SET_GET_MDNS_CONT_QUERY_OPT = (1); -const uint8_t NETAPP_SET_GET_MDNS_QEVETN_MASK_OPT = (2); -const uint8_t NETAPP_SET_GET_MDNS_TIMING_PARAMS_OPT = (3); - -/* DNS server set/get options */ -const uint8_t NETAPP_SET_GET_DNS_OPT_DOMAIN_NAME = (0); - -/* Device Config set/get options */ -const uint8_t NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN = (0); -const uint8_t NETAPP_SET_GET_DEV_CONF_OPT_DOMAIN_NAME = (1); - - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ -/* - * The below structure depict the constant parameters that are returned in the Async event answer - * according to command/API sl_DnsGetHostByService for IPv4 and IPv6. - * - 1Status - The status of the response. - 2.Address - Contains the IP address of the service. - 3.Port - Contains the port of the service. - 4.TextLen - Contains the max length of the text that the user wants to get. - it means that if the test of service is bigger that its value than - the text is cut to inout_TextLen value. - Output: Contain the length of the text that is returned. Can be full text or part - of the text (see above). - -* - */ -typedef struct { - uint16_t Status; - uint16_t TextLen; - uint32_t Port; - uint32_t Address; -} _GetHostByServiceIPv4AsyncResponse_t; - -/* - * The below struct contains pointers to the output parameters that the user gives - * - */ -typedef struct { - int16_t Status; - uint32_t *out_pAddr; - uint32_t *out_pPort; - uint16_t *inout_TextLen; // in: max len , out: actual len - unsigned char *out_pText; -} _GetHostByServiceAsyncResponse_t; - -typedef struct { - uint32_t PacketsSent; - uint32_t PacketsReceived; - uint16_t MinRoundTime; - uint16_t MaxRoundTime; - uint16_t AvgRoundTime; - uint32_t TestTime; -} SlPingReport_t; - -typedef struct { - uint32_t PingIntervalTime; /* delay between pings, in milliseconds */ - uint16_t PingSize; /* ping packet size in bytes */ - uint16_t PingRequestTimeout; /* timeout time for every ping in milliseconds */ - uint32_t TotalNumberOfAttempts; /* max number of ping requests. 0 - forever */ - uint32_t Flags; /* flag - 0 report only when finished, 1 - return response for every ping, 2 - stop after 1 successful ping. */ - uint32_t Ip; /* IPv4 address or IPv6 first 4 bytes */ - uint32_t Ip1OrPaadding; - uint32_t Ip2OrPaadding; - uint32_t Ip3OrPaadding; -} SlPingStartCommand_t; - -typedef struct _slHttpServerString_t { - uint8_t len; - uint8_t *data; -} slHttpServerString_t; - -typedef struct _slHttpServerData_t { - uint8_t value_len; - uint8_t name_len; - uint8_t *token_value; - uint8_t *token_name; -} slHttpServerData_t; - -typedef struct _slHttpServerPostData_t { - slHttpServerString_t action; - slHttpServerString_t token_name; - slHttpServerString_t token_value; -} slHttpServerPostData_t; - -typedef union { - slHttpServerString_t httpTokenName; /* SL_NETAPP_HTTPGETTOKENVALUE */ - slHttpServerPostData_t httpPostData; /* SL_NETAPP_HTTPPOSTTOKENVALUE */ -} SlHttpServerEventData_u; - -typedef union { - slHttpServerString_t token_value; -} SlHttpServerResponsedata_u; - -typedef struct { - uint32_t Event; - SlHttpServerEventData_u EventData; -} SlHttpServerEvent_t; - -typedef struct { - uint32_t Response; - SlHttpServerResponsedata_u ResponseData; -} SlHttpServerResponse_t; - - -typedef struct { - uint32_t lease_time; - uint32_t ipv4_addr_start; - uint32_t ipv4_addr_last; -} SlNetAppDhcpServerBasicOpt_t; - -/*mDNS parameters*/ -typedef enum { - SL_NET_APP_FULL_SERVICE_WITH_TEXT_IPV4_TYPE = 1, - SL_NET_APP_FULL_SERVICE_IPV4_TYPE, - SL_NET_APP_SHORT_SERVICE_IPV4_TYPE - -} SlNetAppGetServiceListType_e; - -typedef struct { - uint32_t service_ipv4; - uint16_t service_port; - uint16_t Reserved; -} SlNetAppGetShortServiceIpv4List_t; - -typedef struct { - uint32_t service_ipv4; - uint16_t service_port; - uint16_t Reserved; - uint8_t service_name[NETAPP_MAX_SERVICE_NAME_SIZE]; - uint8_t service_host[NETAPP_MAX_SERVICE_HOST_NAME_SIZE]; -} SlNetAppGetFullServiceIpv4List_t; - -typedef struct { - uint32_t service_ipv4; - uint16_t service_port; - uint16_t Reserved; - uint8_t service_name[NETAPP_MAX_SERVICE_NAME_SIZE]; - uint8_t service_host[NETAPP_MAX_SERVICE_HOST_NAME_SIZE]; - uint8_t service_text[NETAPP_MAX_SERVICE_TEXT_SIZE]; -} SlNetAppGetFullServiceWithTextIpv4List_t; - -typedef struct { - /*The below parameters are used to configure the advertise times and interval - For example: - If: - Period is set to T - Repetitions are set to P - Telescopic factor is K=2 - The transmission shall be: - advertise P times - wait T - advertise P times - wait 4 * T - advertise P time - wait 16 * T ... (till max time reached / configuration changed / query issued) - */ - uint32_t t; /* Number of ticks for the initial period. Default is 100 ticks for 1 second. */ - uint32_t p; /* Number of repetitions. Default value is 1 */ - uint32_t k; /* Telescopic factor. Default value is 2. */ - uint32_t RetransInterval;/* Announcing retransmission interval */ - uint32_t Maxinterval; /* Announcing max period interval */ - uint32_t max_time; /* Announcing max time */ -} SlNetAppServiceAdvertiseTimingParameters_t; - -/*****************************************************************************/ -/* Types declarations */ -/*****************************************************************************/ -typedef void (*P_SL_DEV_PING_CALLBACK)(SlPingReport_t*); -extern P_SL_DEV_PING_CALLBACK pPingCallBackFunc; - -/***************************************************************************************** -* NETAPP structs -******************************************************************************************/ - - -typedef _BasicResponse_t _NetAppStartStopResponse_t; - -typedef struct { - uint32_t appId; -} _NetAppStartStopCommand_t; - -typedef struct { - uint16_t Status; - uint16_t AppId; - uint16_t ConfigOpt; - uint16_t ConfigLen; -} _NetAppSetGet_t; -typedef struct { - uint16_t port_number; -} _NetAppHttpServerGetSet_port_num_t; - -typedef struct { - uint8_t auth_enable; -} _NetAppHttpServerGetSet_auth_enable_t; - -typedef struct _sl_NetAppHttpServerGetToken_t { - uint8_t token_name_len; - uint8_t padd1; - uint16_t padd2; -} sl_NetAppHttpServerGetToken_t; - -typedef struct _sl_NetAppHttpServerSendToken_t { - uint8_t token_value_len; - uint8_t token_name_len; - uint8_t token_name[MAX_TOKEN_NAME_LEN]; - uint16_t padd; -} sl_NetAppHttpServerSendToken_t; - -typedef struct _sl_NetAppHttpServerPostToken_t { - uint8_t post_action_len; - uint8_t token_name_len; - uint8_t token_value_len; - uint8_t padding; -} sl_NetAppHttpServerPostToken_t; - - -typedef struct { - uint16_t Len; - uint8_t family; - uint8_t padding; -} _GetHostByNameCommand_t; - -typedef struct { - uint16_t status; - uint16_t padding; - uint32_t ip0; - uint32_t ip1; - uint32_t ip2; - uint32_t ip3; -} _GetHostByNameIPv6AsyncResponse_t; - -typedef struct { - uint16_t status; - uint8_t padding1; - uint8_t padding2; - uint32_t ip0; -} _GetHostByNameIPv4AsyncResponse_t; - -typedef enum { - CTST_BSD_UDP_TX, - CTST_BSD_UDP_RX, - CTST_BSD_TCP_TX, - CTST_BSD_TCP_RX, - CTST_BSD_TCP_SERVER_BI_DIR, - CTST_BSD_TCP_CLIENT_BI_DIR, - CTST_BSD_UDP_BI_DIR, - CTST_BSD_RAW_TX, - CTST_BSD_RAW_RX, - CTST_BSD_RAW_BI_DIR, - CTST_BSD_SECURED_TCP_TX, - CTST_BSD_SECURED_TCP_RX, - CTST_BSD_SECURED_TCP_SERVER_BI_DIR, - CTST_BSD_SECURED_TCP_CLIENT_BI_DIR -} CommTest_e; - -typedef struct _sl_protocol_CtestStartCommand_t { - uint32_t Test; - uint16_t DestPort; - uint16_t SrcPort; - uint32_t DestAddr[4]; - uint32_t PayloadSize; - uint32_t timeout; - uint32_t csEnabled; - uint32_t secure; - uint32_t rawProtocol; - uint8_t reserved1[4]; -} _CtestStartCommand_t; - -typedef struct { - uint8_t test; - uint8_t socket; - int16_t status; - uint32_t startTime; - uint32_t endTime; - uint16_t txKbitsSec; - uint16_t rxKbitsSec; - uint32_t outOfOrderPackets; - uint32_t missedPackets; -} _CtestAsyncResponse_t; - -typedef struct { - uint32_t pingIntervalTime; - uint16_t PingSize; - uint16_t pingRequestTimeout; - uint32_t totalNumberOfAttempts; - uint32_t flags; - uint32_t ip0; - uint32_t ip1OrPaadding; - uint32_t ip2OrPaadding; - uint32_t ip3OrPaadding; -} _PingStartCommand_t; - -typedef struct { - uint16_t status; - uint16_t rttMin; - uint16_t rttMax; - uint16_t rttAvg; - uint32_t numSuccsessPings; - uint32_t numSendsPings; - uint32_t testTime; -} _PingReportResponse_t; - - -typedef struct { - uint32_t ip; - uint32_t gateway; - uint32_t dns; -} _IpV4AcquiredAsync_t; - - -typedef enum { - ACQUIRED_IPV6_LOCAL = 1, - ACQUIRED_IPV6_GLOBAL -} IpV6AcquiredType_e; - - -typedef struct { - uint32_t type; - uint32_t ip[4]; - uint32_t gateway[4]; - uint32_t dns[4]; -} _IpV6AcquiredAsync_t; - - -typedef union { - _SocketCommand_t EventMask; - _sendRecvCommand_t DeviceInit; -} _device_commands_t; - - -class cc3100_netapp -{ - -public: - - cc3100_netapp(cc3100_driver &driver, cc3100_nonos &nonos); - - ~cc3100_netapp(); - - /*****************************************************************************/ - /* Functions prototypes */ - /*****************************************************************************/ - int16_t sl_NetAppMDNSRegisterUnregisterService(const char* pServiceName, uint8_t ServiceNameLen, const char* pText, uint8_t TextLen, uint16_t Port, uint32_t TTL, uint32_t Options); - - void _sl_HandleAsync_DnsGetHostByAddr(void *pVoidBuf); - - void CopyPingResultsToReport(_PingReportResponse_t *pResults,SlPingReport_t *pReport); - - uint16_t sl_NetAppSendTokenValue(slHttpServerData_t * Token); - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - - /*! - \brief Starts a network application - - Gets and starts network application for the current WLAN mode - - \param[in] AppBitMap application bitmap, could be one or combination of the following: \n - - SL_NET_APP_HTTP_SERVER_ID - - SL_NET_APP_DHCP_SERVER_ID - - SL_NET_APP_MDNS_ID - - \return On error, negative number is returned - - \sa Stop one or more the above started applications using sl_NetAppStop - \note This command activates the application for the current WLAN mode (AP or STA) - \warning - \par Example: - \code - For example: Starting internal HTTP server + DHCP server: - sl_NetAppStart(SL_NET_APP_HTTP_SERVER_ID | SL_NET_APP_DHCP_SERVER_ID) - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_NetAppStart) - int16_t sl_NetAppStart(uint32_t AppBitMap); -#endif - /*! - \brief Stops a network application - - Gets and stops network application for the current WLAN mode - - \param[in] AppBitMap application id, could be one of the following: \n - - SL_NET_APP_HTTP_SERVER_ID - - SL_NET_APP_DHCP_SERVER_ID - - SL_NET_APP_MDNS_ID - - \return On error, negative number is returned - - \sa - \note This command disables the application for the current active WLAN mode (AP or STA) - \warning - \par Example: - \code - - For example: Stopping internal HTTP server: - sl_NetAppStop(SL_NET_APP_HTTP_SERVER_ID); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_NetAppStop) - int16_t sl_NetAppStop(uint32_t AppBitMap); -#endif - - /*! - \brief Get host IP by name - - Obtain the IP Address of machine on network, by machine name. - - \param[in] hostname host name - \param[in] usNameLen name length - \param[out] out_ip_addr This parameter is filled in with - host IP address. In case that host name is not - resolved, out_ip_addr is zero. - \param[in] family protocol family - - \return On success, 0 is returned. - On error, negative is returned - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - Possible DNS error codes: - - SL_NET_APP_DNS_QUERY_NO_RESPONSE - - SL_NET_APP_DNS_NO_SERVER - - SL_NET_APP_DNS_QUERY_FAILED - - SL_NET_APP_DNS_MALFORMED_PACKET - - SL_NET_APP_DNS_MISMATCHED_RESPONSE - - \sa - \note Only one sl_NetAppDnsGetHostByName can be handled at a time. - Calling this API while the same command is called from another thread, may result - in one of the two scenarios: - 1. The command will wait (internal) until the previous command finish, and then be executed. - 2. There are not enough resources and POOL_IS_EMPTY error will return. - In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try - again later to issue the command. - \warning - \par Example: - \code - uint32_t DestinationIP; - sl_NetAppDnsGetHostByName("www.google.com", strlen("www.google.com"), &DestinationIP,SL_AF_INET); - - Addr.sin_family = SL_AF_INET; - Addr.sin_port = sl_Htons(80); - Addr.sin_addr.s_addr = sl_Htonl(DestinationIP); - AddrSize = sizeof(SlSockAddrIn_t); - SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByName) - int16_t sl_NetAppDnsGetHostByName(unsigned char * hostname, uint16_t usNameLen, uint32_t* out_ip_addr,uint8_t family ); -#endif - - /*! - \brief Return service attributes like IP address, port and text according to service name - \par - The user sets a service name Full/Part (see example below), and should get: - - IP of service - - The port of service - - The text of service - - Hence it can make a connection to the specific service and use it. - It is similar to get host by name method. - It is done by a single shot query with PTR type on the service name. - The command that is sent is from constant parameters and variables parameters. - - \param[in] pService Service name can be full or partial. \n - Example for full service name: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local \n - . - Example for partial service name: - 1. _ipp._tcp.local - 2. _ftp._tcp.local - - \param[in] ServiceLen The length of the service name (in_pService). - \param[in] Family IPv4 or IPv6 (SL_AF_INET , SL_AF_INET6). - \param[out] pAddr Contains the IP address of the service. - \param[out] pPort Contains the port of the service. - \param[out] pTextLen Has 2 options. One as Input field and the other one as output: - - Input: \n - Contains the max length of the text that the user wants to get.\n - It means that if the text len of service is bigger that its value than - the text is cut to inout_TextLen value. - - Output: \n - Contain the length of the text that is returned. Can be full text or part of the text (see above). - - \param[out] pOut_pText Contains the text of the service full or partial - - \return On success, zero is returned - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - In case No service is found error SL_NET_APP_DNS_NO_ANSWER will be returned - - \note The returns attributes belongs to the first service found. - There may be other services with the same service name that will response to the query. - The results of these responses are saved in the peer cache of the Device and should be read by another API. - - Only one sl_NetAppDnsGetHostByService can be handled at a time. - Calling this API while the same command is called from another thread, may result - in one of the two scenarios: - 1. The command will wait (internal) until the previous command finish, and then be executed. - 2. There are not enough resources and SL_POOL_IS_EMPTY error will return. - In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try - again later to issue the command. - - \warning Text length can be 120 bytes only - */ -#if _SL_INCLUDE_FUNC(sl_NetAppDnsGetHostByService) - int32_t sl_NetAppDnsGetHostByService(unsigned char *pServiceName, /* string containing all (or only part): name + subtype + service */ - uint8_t ServiceLen, - uint8_t Family, /* 4-IPv4 , 16-IPv6 */ - uint32_t pAddr[], - uint32_t *pPort, - uint16_t *pTextLen, /* in: max len , out: actual len */ - unsigned char *pText - ); - -#endif - - /*! - \brief Get service List - Insert into out pBuffer a list of peer's services that are the NWP. - The list is in a form of service struct. The user should chose the type - of the service struct like: - - Full service parameters with text. - - Full service parameters. - - Short service parameters (port and IP only) especially for tiny hosts. - - The different types of struct are made to give the - Possibility to save memory in the host - - - The user also chose how many max services to get and start point index - NWP peer cache. - For example: - 1. Get max of 3 full services from index 0.Up to 3 full services - from index 0 are inserted into pBuffer (services that are in indexes 0,1,2). - 2. Get max of 4 full services from index 3.Up to 4 full services - from index 3 are inserted into pBuffer (services that are in indexes 3,4,5,6). - 3. Get max of 2 int services from index 6.Up to 2 int services - from index 6 are inserted into pBuffer (services that are in indexes 6,7). - - See below - command parameters. - - \param[in] indexOffset - The start index in the peer cache that from it the first service is returned. - \param[in] MaxServiceCount - The Max services that can be returned if existed or if not exceed the max index - in the peer cache - \param[in] Flags - an ENUM number that means which service struct to use (means which types of service to fill) - - use SlNetAppGetFullServiceWithTextIpv4List_t - - use SlNetAppGetFullServiceIpv4List_t - - use SlNetAppGetShortServiceIpv4List_t - - \param[out] Buffer - The Services are inserted into this buffer. In the struct form according to the bit that is set in the Flags - input parameter. - - \return ServiceFoundCount - The number of the services that were inserted into the buffer. zero means no service is found - negative number means an error - \sa sl_NetAppMDNSRegisterService - \note - \warning - if the out pBuffer size is bigger than an RX packet(1480), than - an error is returned because there - is no place in the RX packet. - The size is a multiply of MaxServiceCount and size of service struct(that is set - according to flag value). - */ - -#if _SL_INCLUDE_FUNC(sl_NetAppGetServiceList) - int16_t sl_NetAppGetServiceList(uint8_t IndexOffest, - uint8_t MaxServiceCount, - uint8_t Flags, - int8_t *pBuffer, - uint32_t RxBufferLength - ); - -#endif - - /*! - \brief Unregister mDNS service - This function deletes the mDNS service from the mDNS package and the database. - - The mDNS service that is to be unregistered is a service that the application no longer wishes to provide. \n - The service name should be the full service name according to RFC - of the DNS-SD - meaning the value in name field in the SRV answer. - - Examples for service names: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - - \param[in] pServiceName Full service name. \n - Example for service name: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - \param[in] ServiceLen The length of the service. - \return On success, zero is returned - \sa sl_NetAppMDNSRegisterService - \note - \warning - The size of the service length should be smaller than 255. - */ -#if _SL_INCLUDE_FUNC(sl_NetAppMDNSUnRegisterService) - int16_t sl_NetAppMDNSUnRegisterService(const char *pServiceName,uint8_t ServiceNameLen); -#endif - - /*! - \brief Register a new mDNS service - \par - This function registers a new mDNS service to the mDNS package and the DB. - - This registered service is a service offered by the application. - The service name should be full service name according to RFC - of the DNS-SD - meaning the value in name field in the SRV answer. - Example for service name: - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - - If the option is_unique is set, mDNS probes the service name to make sure - it is unique before starting to announce the service on the network. - Instance is the instance portion of the service name. - - \param[in] ServiceLen The length of the service. - \param[in] TextLen The length of the service should be smaller than 64. - \param[in] port The port on this target host port. - \param[in] TTL The TTL of the service - \param[in] Options bitwise parameters: \n - - bit 0 - service is unique (means that the service needs to be unique) - - bit 31 - for internal use if the service should be added or deleted (set means ADD). - - bit 1-30 for future. - - \param[in] pServiceName The service name. - Example for service name: \n - 1. PC1._ipp._tcp.local - 2. PC2_server._ftp._tcp.local - - \param[in] pText The description of the service. - should be as mentioned in the RFC - (according to type of the service IPP,FTP...) - - \return On success, zero is returned - Possible error codes: - - Maximum advertise services are already configured. - Delete another existed service that is registered and then register again the new service - - Trying to register a service that is already exists - - Trying to delete service that does not existed - - Illegal service name according to the RFC - - Retry request - - Illegal length of one of the mDNS Set functions - - mDNS is not operational as the device has no IP.Connect the device to an AP to get an IP address. - - mDNS parameters error - - mDNS internal cache error - - mDNS internal error - - Adding a service is not allowed as it is already exist (duplicate service) - - mDNS is not running - - Host name error. Host name format is not allowed according to RFC 1033,1034,1035, 6763 - - List size buffer is bigger than internally allowed in the NWP (API get service list), - change the APIsďż˝ parameters to decrease the size of the list - - - \sa sl_NetAppMDNSUnRegisterService - - \warning 1) Temporary - there is an allocation on stack of internal buffer. - Its size is NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH. \n - It means that the sum of the text length and service name length cannot be bigger than - NETAPP_MDNS_MAX_SERVICE_NAME_AND_TEXT_LENGTH.\n - If it is - An error is returned. \n - 2) According to now from certain constraints the variables parameters are set in the - attribute part (contain constant parameters) - */ -#if _SL_INCLUDE_FUNC(sl_NetAppMDNSRegisterService) - int16_t sl_NetAppMDNSRegisterService( const char* pServiceName, - uint8_t ServiceNameLen, - const char* pText, - uint8_t TextLen, - uint16_t Port, - uint32_t TTL, - uint32_t Options); -#endif - - /*! - \brief send ICMP ECHO_REQUEST to network hosts - - Ping uses the ICMP protocol's mandatory ECHO_REQUEST - - \param[in] pPingParams Pointer to the ping request structure: \n - - if flags parameter is set to 0, ping will report back once all requested pings are done (as defined by TotalNumberOfAttempts). \n - - if flags parameter is set to 1, ping will report back after every ping, for TotalNumberOfAttempts. - - if flags parameter is set to 2, ping will stop after the first successful ping, and report back for the successful ping, as well as any preceding failed ones. - For stopping an ongoing ping activity, set parameters IP address to 0 - - \param[in] family SL_AF_INET or SL_AF_INET6 - \param[out] pReport Ping pReport - \param[out] pCallback Callback function upon completion. - If callback is NULL, the API is blocked until data arrives - - - \return On success, zero is returned. On error, -1 is returned - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_NetAppPingReport - \note Only one sl_NetAppPingStart can be handled at a time. - Calling this API while the same command is called from another thread, may result - in one of the two scenarios: - 1. The command will wait (internal) until the previous command finish, and then be executed. - 2. There are not enough resources and SL_POOL_IS_EMPTY error will return. - In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try - again later to issue the command. - \warning - \par Example: - \code - - An example of sending 20 ping requests and reporting results to a callback routine when - all requests are sent: - - // callback routine - void pingRes(SlPingReport_t* pReport) - { - // handle ping results - } - - // ping activation - void PingTest() - { - SlPingReport_t report; - SlPingStartCommand_t pingCommand; - - pingCommand.Ip = SL_IPV4_VAL(10,1,1,200); // destination IP address is 10.1.1.200 - pingCommand.PingSize = 150; // size of ping, in bytes - pingCommand.PingIntervalTime = 100; // delay between pings, in milliseconds - pingCommand.PingRequestTimeout = 1000; // timeout for every ping in milliseconds - pingCommand.TotalNumberOfAttempts = 20; // max number of ping requests. 0 - forever - pingCommand.Flags = 0; // report only when finished - - sl_NetAppPingStart( &pingCommand, SL_AF_INET, &report, pingRes ) ; - } - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_NetAppPingStart) - int16_t sl_NetAppPingStart(SlPingStartCommand_t* pPingParams,uint8_t family,SlPingReport_t *pReport,const P_SL_DEV_PING_CALLBACK pPingCallback); -#endif - - /*! - \brief Internal function for setting network application configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] AppId Application id, could be one of the following: \n - - SL_NET_APP_HTTP_SERVER_ID - - SL_NET_APP_DHCP_SERVER_ID - - SL_NET_APP_DHCP_SERVER_ID - - \param[in] SetOptions set option, could be one of the following: \n - NETAPP_SET_BASIC_OPT - - \param[in] OptionLen option structure length - - \param[in] pOptionValues pointer to the option structure - \sa - \note - \warning - \par - \code - Set DHCP Server (AP mode) parameters example: - - SlNetAppDhcpServerBasicOpt_t dhcpParams; - uint8_t outLen = sizeof(SlNetAppDhcpServerBasicOpt_t); - dhcpParams.lease_time = 4096; // lease time (in seconds) of the IP Address - dhcpParams.ipv4_addr_start = SL_IPV4_VAL(192,168,1,10); // first IP Address for allocation. IP Address should be set as Hex number - i.e. 0A0B0C01 for (10.11.12.1) - dhcpParams.ipv4_addr_last = SL_IPV4_VAL(192,168,1,16); // last IP Address for allocation. IP Address should be set as Hex number - i.e. 0A0B0C01 for (10.11.12.1) - sl_NetAppStop(SL_NET_APP_DHCP_SERVER_ID); // Stop DHCP server before settings - sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT, outLen, (uint8_t* )&dhcpParams); // set parameters - sl_NetAppStart(SL_NET_APP_DHCP_SERVER_ID); // Start DHCP server with new settings - \endcode - \code - Set Device URN name example: - - Device name, maximum length of 33 characters - Device name affects URN name, own SSID name in AP mode, and WPS file "device name" in WPS I.E (STA-WPS / P2P) - In case no device URN name set, the default name is "mysimplelink" - Allowed characters in device name are: 'a - z' , 'A - Z' , '0-9' and '-' - - uint8_t *my_device = "MY-SIMPLELINK-DEV"; - sl_NetAppSet (SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, strlen(my_device), (uint8_t *) my_device); - \endcode - - */ -#if _SL_INCLUDE_FUNC(sl_NetAppSet) - int32_t sl_NetAppSet(uint8_t AppId ,uint8_t Option,uint8_t OptionLen, uint8_t *pOptionValue); -#endif - - /*! - \brief Internal function for getting network applications configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] AppId Application id, could be one of the following: \n - - SL_NET_APP_HTTP_SERVER_ID - - SL_NET_APP_DHCP_SERVER_ID - - \param[in] Options Get option, could be one of the following: \n - NETAPP_SET_BASIC_OPT - - \param[in] OptionLen The length of the allocated memory as input, when the - function complete, the value of this parameter would be - the len that actually read from the device. - If the device return length that is longer from the input - value, the function will cut the end of the returned structure - and will return ESMALLBUF - - \param[out] pValues pointer to the option structure which will be filled with the response from the device - - \sa - \note - \warning - \par - \code - Get DHCP Server parameters example: - - SlNetAppDhcpServerBasicOpt_t dhcpParams; - uint8_t outLen = sizeof(SlNetAppDhcpServerBasicOpt_t); - sl_NetAppGet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT, &outLen, (uint8_t* )&dhcpParams); - - printf("DHCP Start IP %d.%d.%d.%d End IP %d.%d.%d.%d Lease time seconds %d\n", - SL_IPV4_BYTE(dhcpParams.ipv4_addr_start,3),SL_IPV4_BYTE(dhcpParams.ipv4_addr_start,2), - SL_IPV4_BYTE(dhcpParams.ipv4_addr_start,1),SL_IPV4_BYTE(dhcpParams.ipv4_addr_start,0), - SL_IPV4_BYTE(dhcpParams.ipv4_addr_last,3),SL_IPV4_BYTE(dhcpParams.ipv4_addr_last,2), - SL_IPV4_BYTE(dhcpParams.ipv4_addr_last,1),SL_IPV4_BYTE(dhcpParams.ipv4_addr_last,0), - dhcpParams.lease_time); - \endcode - \code - Get Device URN name example: - Maximum length of 33 characters of device name. - Device name affects URN name, own SSID name in AP mode, and WPS file "device name" in WPS I.E (STA-WPS / P2P) - in case no device URN name set, the default name is "mysimplelink" - - uint8_t my_device_name[35]; - sl_NetAppGet (SL_NET_APP_DEVICE_CONFIG_ID, NETAPP_SET_GET_DEV_CONF_OPT_DEVICE_URN, strlen(my_device_name), (uint8_t *)my_device_name); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_NetAppGet) - int32_t sl_NetAppGet(uint8_t AppId, uint8_t Option,uint8_t *pOptionLen, uint8_t *pOptionValue); -#endif - -private: - - cc3100_driver &_driver; - cc3100_nonos &_nonos; - - -};//class - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ -const uint8_t FLOW_CONT_MIN = 1; - - -class cc3100_flowcont -{ - -public: - - cc3100_flowcont(cc3100_driver &driver, cc3100_nonos &nonos); - - - ~cc3100_flowcont(); - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - void _SlDrvFlowContInit(void); - void _SlDrvFlowContDeinit(void); - -private: - - cc3100_driver &_driver; - cc3100_nonos &_nonos; - -};//class -}//namespace mbed_cc3100 - -/*! - - Close the Doxygen group. - @} - - */ - -#endif /* __NETAPP_H__ */ - -
--- a/simplelink/cc3100_netcfg.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* -* netcfg.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_netcfg.h" - -namespace mbed_cc3100 { - -cc3100_netcfg::cc3100_netcfg(cc3100_driver &driver) - : _driver(driver) -{ - -} - -cc3100_netcfg::~cc3100_netcfg() -{ - -} - -/*****************************************************************************/ -/* sl_NetCfgSet */ -/*****************************************************************************/ -typedef union { - _NetCfgSetGet_t Cmd; - _BasicResponse_t Rsp; -} _SlNetCfgMsgSet_u; - -const _SlCmdCtrl_t _SlNetCfgSetCmdCtrl = { - SL_OPCODE_DEVICE_NETCFG_SET_COMMAND, - sizeof(_NetCfgSetGet_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_NetCfgSet) -int32_t cc3100_netcfg::sl_NetCfgSet(uint8_t ConfigId ,uint8_t ConfigOpt,uint8_t ConfigLen, uint8_t *pValues) -{ - _SlNetCfgMsgSet_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 *)&_SlNetCfgSetCmdCtrl, &Msg, &CmdExt)); - - return (int16_t)Msg.Rsp.status; -} -#endif - -uint32_t cc3100_netcfg::SL_IPV4_VAL(uint8_t add_3,uint8_t add_2,uint8_t add_1,uint8_t add_0){ - - return((((uint32_t)add_3 << 24) & 0xFF000000) | (((uint32_t)add_2 << 16) & 0xFF0000) | (((uint32_t)add_1 << 8) & 0xFF00) | ((uint32_t)add_0 & 0xFF) ); -} - -uint8_t cc3100_netcfg::SL_IPV4_BYTE(uint32_t val,uint8_t index){ - - return( (val >>= (index*8)) & 0xFF ); -} - -/*****************************************************************************/ -/* sl_NetCfgGet */ -/*****************************************************************************/ -typedef union { - _NetCfgSetGet_t Cmd; - _NetCfgSetGet_t Rsp; -} _SlNetCfgMsgGet_u; - -const _SlCmdCtrl_t _SlNetCfgGetCmdCtrl = { - SL_OPCODE_DEVICE_NETCFG_GET_COMMAND, - sizeof(_NetCfgSetGet_t), - sizeof(_NetCfgSetGet_t) -}; - -#if _SL_INCLUDE_FUNC(sl_NetCfgGet) -int32_t cc3100_netcfg::sl_NetCfgGet(uint8_t ConfigId, uint8_t *pConfigOpt,uint8_t *pConfigLen, uint8_t *pValues) -{ - _SlNetCfgMsgGet_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.ConfigLen = *pConfigLen; - Msg.Cmd.ConfigId = ConfigId; - - if( pConfigOpt ) { - Msg.Cmd.ConfigOpt = (uint16_t)*pConfigOpt; - } - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlNetCfgGetCmdCtrl, &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 - -}//namespace mbed_cc3100
--- a/simplelink/cc3100_netcfg.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,288 +0,0 @@ -/* - * netcfg.h - 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. - * -*/ - -#ifndef NETCFG_H_ -#define NETCFG_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ -#include "cc3100_simplelink.h" - -namespace mbed_cc3100 { - -/*! - - \addtogroup netcfg - @{ - -*/ - - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ -const uint8_t SL_MAC_ADDR_LEN = (6); -const uint8_t IPCONFIG_MODE_DISABLE_IPV4 = (0); -const uint8_t IPCONFIG_MODE_ENABLE_IPV4 = (1); - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ -typedef enum { - SL_MAC_ADDRESS_SET = 1, - SL_MAC_ADDRESS_GET = 2, - SL_IPV4_STA_P2P_CL_GET_INFO = 3, - SL_IPV4_STA_P2P_CL_DHCP_ENABLE = 4, - SL_IPV4_STA_P2P_CL_STATIC_ENABLE = 5, - SL_IPV4_AP_P2P_GO_GET_INFO = 6, - SL_IPV4_AP_P2P_GO_STATIC_ENABLE = 7, - SL_SET_HOST_RX_AGGR = 8, - MAX_SETTINGS = 0xFF -} Sl_NetCfg_e; - - -typedef struct { - uint32_t ipV4; - uint32_t ipV4Mask; - uint32_t ipV4Gateway; - uint32_t ipV4DnsServer; -} SlNetCfgIpV4Args_t; - -class cc3100_netcfg -{ - -public: - - cc3100_netcfg(cc3100_driver &driver); - - ~cc3100_netcfg(); - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - /*! - \brief Internal function for setting network configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] ConfigId configuration id - \param[in] ConfigOpt configurations option - \param[in] ConfigLen configurations len - \param[in] pValues configurations values - - \sa - \note - \warning - - \par Examples: - \code - SL_MAC_ADDRESS_SET: - - Setting MAC address to the Device. - The new MAC address will override the default MAC address and it be saved in the FileSystem. - Requires restarting the device for updating this setting. - - uint8_t MAC_Address[6]; - MAC_Address[0] = 0x8; - MAC_Address[1] = 0x0; - MAC_Address[2] = 0x28; - MAC_Address[3] = 0x22; - MAC_Address[4] = 0x69; - MAC_Address[5] = 0x31; - sl_NetCfgSet(SL_MAC_ADDRESS_SET,1,SL_MAC_ADDR_LEN,(uint8_t *)newMacAddress); - sl_Stop(0); - sl_Start(NULL,NULL,NULL); - \endcode - - \code - SL_IPV4_STA_P2P_CL_STATIC_ENABLE: - - Setting a static IP address to the device working in STA mode or P2P client. - The IP address will be stored in the FileSystem. - In order to disable the static IP and get the address assigned from DHCP one should use SL_STA_P2P_CL_IPV4_DHCP_SET - - SlNetCfgIpV4Args_t ipV4; - ipV4.ipV4 = (uint32_t)SL_IPV4_VAL(10,1,1,201); // uint32_t IP address - ipV4.ipV4Mask = (uint32_t)SL_IPV4_VAL(255,255,255,0); // uint32_t Subnet mask for this STA/P2P - ipV4.ipV4Gateway = (uint32_t)SL_IPV4_VAL(10,1,1,1); // uint32_t Default gateway address - ipV4.ipV4DnsServer = (uint32_t)SL_IPV4_VAL(8,16,32,64); // uint32_t DNS server address - - sl_NetCfgSet(SL_IPV4_STA_P2P_CL_STATIC_ENABLE,IPCONFIG_MODE_ENABLE_IPV4,sizeof(SlNetCfgIpV4Args_t),(uint8_t *)&ipV4); - sl_Stop(0); - sl_Start(NULL,NULL,NULL); - \endcode - - \code - SL_IPV4_STA_P2P_CL_DHCP_ENABLE: - - Setting IP address by DHCP to FileSystem using WLAN sta mode or P2P client. - This should be done once if using Serial Flash. - This is the system's default mode for acquiring an IP address after WLAN connection. - uint8_t val = 1; - sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE,IPCONFIG_MODE_ENABLE_IPV4,1,&val); - sl_Stop(0); - sl_Start(NULL,NULL,NULL); - \endcode - - \code - SL_IPV4_AP_P2P_GO_STATIC_ENABLE: - - Setting a static IP address to the device working in AP mode or P2P go. - The IP address will be stored in the FileSystem. Requires restart. - - SlNetCfgIpV4Args_t ipV4; - ipV4.ipV4 = (uint32_t)SL_IPV4_VAL(10,1,1,201); // uint32_t IP address - ipV4.ipV4Mask = (uint32_t)SL_IPV4_VAL(255,255,255,0); // uint32_t Subnet mask for this AP/P2P - ipV4.ipV4Gateway = (uint32_t)SL_IPV4_VAL(10,1,1,1); // uint32_t Default gateway address - ipV4.ipV4DnsServer = (uint32_t)SL_IPV4_VAL(8,16,32,64); // uint32_t DNS server address - - sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE,IPCONFIG_MODE_ENABLE_IPV4,sizeof(SlNetCfgIpV4Args_t),(uint8_t *)&ipV4); - sl_Stop(0); - sl_Start(NULL,NULL,NULL); - \endcode - - - */ -#if _SL_INCLUDE_FUNC(sl_NetCfgSet) - int32_t sl_NetCfgSet(uint8_t ConfigId ,uint8_t ConfigOpt, uint8_t ConfigLen, uint8_t *pValues); -#endif - - - /*! - \brief Internal function for getting network configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] ConfigId configuration id - - \param[out] pConfigOpt Get configurations option - - \param[out] pConfigLen The length of the allocated memory as input, when the - function complete, the value of this parameter would be - the len that actually read from the device.\n - If the device return length that is longer from the input - value, the function will cut the end of the returned structure - and will return ESMALLBUF - - \param[out] pValues - get configurations values - - \sa - \note - \warning - \par Examples: - \code - SL_MAC_ADDRESS_GET: - - Get the device MAC address. - The returned MAC address is taken from FileSystem first. If the MAC address was not set by SL_MAC_ADDRESS_SET, the default MAC address - is retrieved from HW. - - uint8_t macAddressVal[SL_MAC_ADDR_LEN]; - uint8_t macAddressLen = SL_MAC_ADDR_LEN; - sl_NetCfgGet(SL_MAC_ADDRESS_GET,NULL,&macAddressLen,(uint8_t *)macAddressVal); - - \endcode - - \code - SL_IPV4_STA_P2P_CL_GET_INFO: - - Get IP address from WLAN station or P2P client. A DHCP flag is returned to indicate if the IP address is static or from DHCP. - - uint8_t len = sizeof(SlNetCfgIpV4Args_t); - uint8_t dhcpIsOn = 0; - SlNetCfgIpV4Args_t ipV4 = {0}; - sl_NetCfgGet(SL_IPV4_STA_P2P_CL_GET_INFO,&dhcpIsOn,&len,(uint8_t *)&ipV4); - - printf("DHCP is %s IP %d.%d.%d.%d MASK %d.%d.%d.%d GW %d.%d.%d.%d DNS %d.%d.%d.%d\n", - (dhcpIsOn > 0) ? "ON" : "OFF", - SL_IPV4_BYTE(ipV4.ipV4,3),SL_IPV4_BYTE(ipV4.ipV4,2),SL_IPV4_BYTE(ipV4.ipV4,1),SL_IPV4_BYTE(ipV4.ipV4,0), - SL_IPV4_BYTE(ipV4.ipV4Mask,3),SL_IPV4_BYTE(ipV4.ipV4Mask,2),SL_IPV4_BYTE(ipV4.ipV4Mask,1),SL_IPV4_BYTE(ipV4.ipV4Mask,0), - SL_IPV4_BYTE(ipV4.ipV4Gateway,3),SL_IPV4_BYTE(ipV4.ipV4Gateway,2),SL_IPV4_BYTE(ipV4.ipV4Gateway,1),SL_IPV4_BYTE(ipV4.ipV4Gateway,0), - SL_IPV4_BYTE(ipV4.ipV4DnsServer,3),SL_IPV4_BYTE(ipV4.ipV4DnsServer,2),SL_IPV4_BYTE(ipV4.ipV4DnsServer,1),SL_IPV4_BYTE(ipV4.ipV4DnsServer,0)); - - \endcode - - \code - SL_IPV4_AP_P2P_GO_GET_INFO: - - Get static IP address for AP or P2P go. - - uint8_t len = sizeof(SlNetCfgIpV4Args_t); - uint8_t dhcpIsOn = 0; // this flag is meaningless on AP/P2P go. - SlNetCfgIpV4Args_t ipV4 = {0}; - sl_NetCfgGet(SL_IPV4_AP_P2P_GO_GET_INFO,&dhcpIsOn,&len,(uint8_t *)&ipV4); - - printf("IP %d.%d.%d.%d MASK %d.%d.%d.%d GW %d.%d.%d.%d DNS %d.%d.%d.%d\n", - SL_IPV4_BYTE(ipV4.ipV4,3),SL_IPV4_BYTE(ipV4.ipV4,2),SL_IPV4_BYTE(ipV4.ipV4,1),SL_IPV4_BYTE(ipV4.ipV4,0), - SL_IPV4_BYTE(ipV4.ipV4Mask,3),SL_IPV4_BYTE(ipV4.ipV4Mask,2),SL_IPV4_BYTE(ipV4.ipV4Mask,1),SL_IPV4_BYTE(ipV4.ipV4Mask,0), - SL_IPV4_BYTE(ipV4.ipV4Gateway,3),SL_IPV4_BYTE(ipV4.ipV4Gateway,2),SL_IPV4_BYTE(ipV4.ipV4Gateway,1),SL_IPV4_BYTE(ipV4.ipV4Gateway,0), - SL_IPV4_BYTE(ipV4.ipV4DnsServer,3),SL_IPV4_BYTE(ipV4.ipV4DnsServer,2),SL_IPV4_BYTE(ipV4.ipV4DnsServer,1),SL_IPV4_BYTE(ipV4.ipV4DnsServer,0)); - - \endcode - - - */ -#if _SL_INCLUDE_FUNC(sl_NetCfgGet) - int32_t sl_NetCfgGet(uint8_t ConfigId ,uint8_t *pConfigOpt, uint8_t *pConfigLen, uint8_t *pValues); -#endif - -uint32_t SL_IPV4_VAL(uint8_t add_3,uint8_t add_2,uint8_t add_1,uint8_t add_0); -uint8_t SL_IPV4_BYTE(uint32_t val,uint8_t index); - -private: - - cc3100_driver &_driver; - -};//class - -}//namespace mbed_cc3100 - - /*! - - Close the Doxygen group. - @} - - */ - - -#endif /* __NETCFG_H__ */ - -
--- a/simplelink/cc3100_nonos.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,265 +0,0 @@ -/* -* nonos.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 */ -/*****************************************************************************/ - -#ifndef SL_PLATFORM_MULTI_THREADED - -#include "cc3100_simplelink.h" -#include "cc3100_nonos.h" -#include "fPtr_func.h" - -namespace mbed_cc3100 { - -const uint8_t NONOS_MAX_SPAWN_ENTRIES = 5; - -cc3100_nonos::cc3100_nonos(cc3100_driver &driver) - : _driver(driver) -{ - -} - -cc3100_nonos::~cc3100_nonos() -{ - -} - -typedef struct { - _SlSpawnEntryFunc_t pEntry; - void* pValue; -} _SlNonOsSpawnEntry_t; - -typedef struct { - _SlNonOsSpawnEntry_t SpawnEntries[NONOS_MAX_SPAWN_ENTRIES]; -} _SlNonOsCB_t; - -_SlNonOsCB_t g_SlNonOsCB; - - -_SlNonOsRetVal_t cc3100_nonos::_SlNonOsSemSet(_SlNonOsSemObj_t* pSemObj , _SlNonOsSemObj_t Value) -{ - *pSemObj = Value; - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::_SlNonOsSemGet(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t WaitValue, _SlNonOsSemObj_t SetValue, _SlNonOsTime_t Timeout) -{ - - while (Timeout > 0) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - if (Timeout != NONOS_WAIT_FOREVER) { - Timeout--; - } - _SlNonOsMainLoopTask(); - -#ifdef _SlSyncWaitLoopCallback - if( __NON_OS_SYNC_OBJ_SIGNAL_VALUE == WaitValue ) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - _SlSyncWaitLoopCallback(); - } -#endif - - } - - if (0 == Timeout) { - return NONOS_RET_ERR; - } else { - return NONOS_RET_OK; - } -} - - -_SlNonOsRetVal_t cc3100_nonos::_SlNonOsSpawn(_SlSpawnEntryFunc_t pEntry , void* pValue , uint32_t flags) -{ - int16_t i; - - for (i=0 ; i<NONOS_MAX_SPAWN_ENTRIES ; i++) { - _SlNonOsSpawnEntry_t* pE = &g_SlNonOsCB.SpawnEntries[i]; - - if (NULL == pE->pEntry) { - pE->pValue = pValue; - pE->pEntry = pEntry; - break; - } - } - - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::_SlNonOsMainLoopTask(void) -{ - int16_t i; - - for (i=0 ; i<NONOS_MAX_SPAWN_ENTRIES ; i++) { - _SlNonOsSpawnEntry_t* pE = &g_SlNonOsCB.SpawnEntries[i]; - _SlSpawnEntryFunc_t pF = pE->pEntry; - - if (NULL != pF) { - if((g_pCB)->RxIrqCnt != (g_pCB)->RxDoneCnt) { - _driver._SlDrvMsgReadSpawnCtx_(0); - //pF(0);/*(pValue);*//*Function pointer*/ - } - pE->pEntry = NULL; - pE->pValue = NULL; - } - } - - return NONOS_RET_OK; -} -/* -_SlNonOsRetVal_t cc3100_nonos::sl_SyncObjCreate(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_CLEAR_VALUE) - - *pSemObj = Value; - return NONOS_RET_OK; - -} -*/ -_SlNonOsRetVal_t cc3100_nonos::sl_SyncObjDelete(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pSyncObj,0) - - *pSemObj = Value; - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::sl_SyncObjSignal(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE) - - *pSemObj = Value; - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::sl_SyncObjSignalFromIRQ(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE) - - *pSemObj = Value; - return NONOS_RET_OK; -} -/* -_SlNonOsRetVal_t cc3100_nonos::sl_LockObjCreate(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE) - - *pSemObj = Value; - return NONOS_RET_OK; -} -*/ -_SlNonOsRetVal_t cc3100_nonos::sl_LockObjDelete(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pLockObj,0) - - *pSemObj = Value; - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::sl_LockObjUnlock(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t Value){//_SlNonOsSemSet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE) - - *pSemObj = Value; - return NONOS_RET_OK; -} - -_SlNonOsRetVal_t cc3100_nonos::sl_SyncObjWait(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t WaitValue, _SlNonOsSemObj_t SetValue, _SlNonOsTime_t Timeout){//_SlNonOsSemGet(pSyncObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE,NON_OS_SYNC_OBJ_CLEAR_VALUE,Timeout) - - while (Timeout > 0) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - if (Timeout != NONOS_WAIT_FOREVER) { - Timeout--; - } - _SlNonOsMainLoopTask(); - -#ifdef _SlSyncWaitLoopCallback - if( __NON_OS_SYNC_OBJ_SIGNAL_VALUE == WaitValue ) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - _SlSyncWaitLoopCallback(); - } -#endif - - } - - if (0 == Timeout) { - return NONOS_RET_ERR; - } else { - return NONOS_RET_OK; - } -} - -_SlNonOsRetVal_t cc3100_nonos::sl_LockObjLock(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t WaitValue, _SlNonOsSemObj_t SetValue, _SlNonOsTime_t Timeout){//_SlNonOsSemGet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE,NON_OS_LOCK_OBJ_LOCK_VALUE,Timeout) - - while (Timeout > 0) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - if (Timeout != NONOS_WAIT_FOREVER) { - Timeout--; - } - _SlNonOsMainLoopTask(); - -#ifdef _SlSyncWaitLoopCallback - if( __NON_OS_SYNC_OBJ_SIGNAL_VALUE == WaitValue ) { - if (WaitValue == *pSyncObj) { - *pSyncObj = SetValue; - break; - } - _SlSyncWaitLoopCallback(); - } -#endif - - } - - if (0 == Timeout) { - return NONOS_RET_ERR; - } else { - return NONOS_RET_OK; - } -} - - - -#endif /*(SL_PLATFORM != SL_PLATFORM_NON_OS)*/ - -}//namespace mbed_cc3100 - - -
--- a/simplelink/cc3100_nonos.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,326 +0,0 @@ -/* - * nonos.h - 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. - * -*/ - -#ifndef NONOS_H_ -#define NONOS_H_ - -#include "cc3100_simplelink.h" - -namespace mbed_cc3100 { - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - - -#ifndef SL_PLATFORM_MULTI_THREADED - -/* This function call the user defined function, if defined, from the sync wait loop */ -/* The use case of this function is to allow nonos system to call a user function to put the device into sleep */ -/* The wake up should be activated after getting an interrupt from the device to Host */ -/* The user function must return without blocking to prevent a delay on the event handling */ -/* -#define _SlSyncWaitLoopCallback UserSleepFunction -*/ - -const uint8_t NONOS_WAIT_FOREVER = 0xFF; -const uint8_t NONOS_NO_WAIT = 0x01; - -const uint8_t NONOS_RET_OK = (0); -const int8_t NONOS_RET_ERR = (0xFF); -const uint8_t OSI_OK = NONOS_RET_OK; - -const uint8_t NON_OS_SYNC_OBJ_CLEAR_VALUE = 0x11; -const uint8_t NON_OS_SYNC_OBJ_SIGNAL_VALUE = 0x22; -const uint8_t NON_OS_LOCK_OBJ_UNLOCK_VALUE = 0x33; -const uint8_t NON_OS_LOCK_OBJ_LOCK_VALUE = 0x44; - -#define _SlTime_t _SlNonOsTime_t - -#define _SlSyncObj_t _SlNonOsSemObj_t - -#define _SlLockObj_t _SlNonOsSemObj_t - -const uint8_t SL_OS_WAIT_FOREVER = NONOS_WAIT_FOREVER; - -const uint8_t SL_OS_RET_CODE_OK = NONOS_RET_OK; - -const uint8_t SL_OS_NO_WAIT = NONOS_NO_WAIT; - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - /*! - \brief This function creates a sync object - - The sync object is used for synchronization between different thread or ISR and - a thread. - - \param pSyncObj - pointer to the sync object control block - - \return upon successful creation the function return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -#define _SlNonOsSyncObjCreate(pSyncObj) _SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_CLEAR_VALUE) - - /*! - \brief This function deletes a sync object - - \param pSyncObj - pointer to the sync object control block - - \return upon successful deletion the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsSyncObjDelete(pSyncObj) _SlNonOsSemSet(pSyncObj,0) - - /*! - \brief This function generates a sync signal for the object. - - All suspended threads waiting on this sync object are resumed - - \param pSyncObj - pointer to the sync object control block - - \return upon successful signaling the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note the function could be called from ISR context - \warning - */ -//#define _SlNonOsSyncObjSignal(pSyncObj) _SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE) - - /*! - \brief This function waits for a sync signal of the specific sync object - - \param pSyncObj - pointer to the sync object control block - \param Timeout - numeric value specifies the maximum number of mSec to - stay suspended while waiting for the sync signal - Currently, the simple link driver uses only two values: - - NONOS_WAIT_FOREVER - - NONOS_NO_WAIT - - \return upon successful reception of the signal within the timeout window return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsSyncObjWait(pSyncObj , Timeout) _SlNonOsSemGet(pSyncObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE,NON_OS_SYNC_OBJ_CLEAR_VALUE,Timeout) - - /*! - \brief This function clears a sync object - - \param pSyncObj - pointer to the sync object control block - - \return upon successful clearing the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsSyncObjClear(pSyncObj) _SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_CLEAR_VALUE) - - /*! - \brief This function creates a locking object. - - The locking object is used for protecting a shared resources between different - threads. - - \param pLockObj - pointer to the locking object control block - - \return upon successful creation the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -#define _SlNonOsLockObjCreate(pLockObj) _SlNonOsSemSet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE) - - /*! - \brief This function deletes a locking object. - - \param pLockObj - pointer to the locking object control block - - \return upon successful deletion the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsLockObjDelete(pLockObj) _SlNonOsSemSet(pLockObj,0) - - /*! - \brief This function locks a locking object. - - All other threads that call this function before this thread calls - the _SlNonOsLockObjUnlock would be suspended - - \param pLockObj - pointer to the locking object control block - \param Timeout - numeric value specifies the maximum number of mSec to - stay suspended while waiting for the locking object - Currently, the simple link driver uses only two values: - - NONOS_WAIT_FOREVER - - NONOS_NO_WAIT - - - \return upon successful reception of the locking object the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsLockObjLock(pLockObj , Timeout) _SlNonOsSemGet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE,NON_OS_LOCK_OBJ_LOCK_VALUE,Timeout) - - /*! - \brief This function unlock a locking object. - - \param pLockObj - pointer to the locking object control block - - \return upon successful unlocking the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ -//#define _SlNonOsLockObjUnlock(pLockObj) _SlNonOsSemSet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE) - -/***************************************************************************** - - Overwrite SimpleLink driver OS adaptation functions - - - *****************************************************************************/ - -#undef sl_SyncObjCreate -#define sl_SyncObjCreate(pSyncObj,pName) _SlNonOsSemSet(pSyncObj,NON_OS_SYNC_OBJ_CLEAR_VALUE) - -#undef sl_LockObjCreate -#define sl_LockObjCreate(pLockObj,pName) _SlNonOsSemSet(pLockObj,NON_OS_LOCK_OBJ_UNLOCK_VALUE) - -/*! - \brief type definition for the return values of this adaptation layer -*/ -typedef int8_t _SlNonOsRetVal_t; - -/*! - \brief type definition for a time value -*/ -typedef uint8_t _SlNonOsTime_t; - -/*! - \brief type definition for a sync object container - - Sync object is object used to synchronize between two threads or thread and interrupt handler. - One thread is waiting on the object and the other thread send a signal, which then - release the waiting thread. - The signal must be able to be sent from interrupt context. - This object is generally implemented by binary semaphore or events. -*/ -typedef uint8_t _SlNonOsSemObj_t; - -class cc3100_driver; - -class cc3100_nonos -{ - -public: - - cc3100_nonos(cc3100_driver &driver); - - ~cc3100_nonos(); - - /*! - \brief This function call the pEntry callback from a different context - - \param pEntry - pointer to the entry callback function - - \param pValue - pointer to any type of memory structure that would be - passed to pEntry callback from the execution thread. - - \param flags - execution flags - reserved for future usage - - \return upon successful registration of the spawn the function return 0 - (the function is not blocked till the end of the execution of the function - and could be returned before the execution is actually completed) - Otherwise, a negative value indicating the error code shall be returned - \note - \warning - */ - _SlNonOsRetVal_t _SlNonOsSpawn(_SlSpawnEntryFunc_t pEntry , void* pValue , uint32_t flags); - - - /*! - \brief This function must be called from the main loop in non-os paltforms - - \param None - - \return 0 - No more activities - 1 - Activity still in progress - \note - \warning - */ - _SlNonOsRetVal_t _SlNonOsMainLoopTask(void); - - _SlNonOsRetVal_t _SlNonOsSemGet(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t WaitValue, _SlNonOsSemObj_t SetValue, _SlNonOsTime_t Timeout); - _SlNonOsRetVal_t _SlNonOsSemSet(_SlNonOsSemObj_t* pSemObj , _SlNonOsSemObj_t Value); -// _SlNonOsRetVal_t _SlNonOsSpawn(_SlSpawnEntryFunc_t pEntry , void* pValue , uint32_t flags); -// _SlNonOsRetVal_t sl_SyncObjCreate(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t NON_OS_SYNC_OBJ_CLEAR_VALUE); - _SlNonOsRetVal_t sl_SyncObjDelete(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t ); - _SlNonOsRetVal_t sl_SyncObjSignal(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t NON_OS_SYNC_OBJ_SIGNAL_VALUE); - _SlNonOsRetVal_t sl_SyncObjSignalFromIRQ(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t NON_OS_SYNC_OBJ_SIGNAL_VALUE); -// _SlNonOsRetVal_t sl_LockObjCreate(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t NON_OS_LOCK_OBJ_UNLOCK_VALUE); - _SlNonOsRetVal_t sl_LockObjDelete(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t ); - _SlNonOsRetVal_t sl_LockObjUnlock(_SlNonOsSemObj_t* pSemObj, _SlNonOsSemObj_t NON_OS_LOCK_OBJ_UNLOCK_VALUE); - _SlNonOsRetVal_t sl_SyncObjWait(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t NON_OS_SYNC_OBJ_SIGNAL_VALUE, _SlNonOsSemObj_t NON_OS_SYNC_OBJ_CLEAR_VALUE, _SlNonOsTime_t Timeout); - _SlNonOsRetVal_t sl_LockObjLock(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t NON_OS_LOCK_OBJ_UNLOCK_VALUE, _SlNonOsSemObj_t NON_OS_LOCK_OBJ_LOCK_VALUE, _SlNonOsTime_t Timeout); - - -#if (defined(_SlSyncWaitLoopCallback)) - void _SlSyncWaitLoopCallback(void); -#endif - -private: - - cc3100_driver &_driver; - -};//class - -}//namespace mbed_cc3100 - -#endif /* !SL_PLATFORM_MULTI_THREADED */ - - - -#endif -
--- a/simplelink/cc3100_objInclusion.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,318 +0,0 @@ -/* - * objInclusion.h - 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. - * -*/ -#ifndef OBJINCLUSION_H_ -#define OBJINCLUSION_H_ - - -#include "cc3100_simplelink.h" - - -/****************************************************************************** - - For future use - -*******************************************************************************/ - -#define __inln /* if inline functions requiered: #define __inln inline */ - -#define SL_DEVICE /* Device silo is currently always mandatory */ - - - -/****************************************************************************** - - Qualifiers for package customizations - -*******************************************************************************/ - -#if defined (SL_DEVICE) -#define __dev 1 -#else -#define __dev 0 -#endif - -#if defined (SL_DEVICE) && defined (SL_INC_EXT_API) -#define __dev__ext 1 -#else -#define __dev__ext 0 -#endif - - -#if (!defined (SL_PLATFORM_MULTI_THREADED)) || (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) -#define __int__spwn 1 -#else -#define __int__spwn 0 -#endif - -#if defined (SL_INC_NET_APP_PKG) -#define __nap 1 -#else -#define __nap 0 -#endif - -#if defined (SL_INC_NET_APP_PKG) && defined (SL_INC_SOCK_CLIENT_SIDE_API) -#define __nap__clt 1 -#else -#define __nap__clt 0 -#endif - -#if defined (SL_INC_NET_APP_PKG) && defined (SL_INC_EXT_API) -#define __nap__ext 1 -#else -#define __nap__ext 0 -#endif - -#if defined (SL_INC_NET_CFG_PKG) -#define __ncg 1 -#else -#define __ncg 0 -#endif - -#if defined (SL_INC_NET_CFG_PKG) && defined (SL_INC_EXT_API) -#define __ncg__ext 1 -#else -#define __ncg__ext 0 -#endif - -#if defined (SL_INC_NVMEM_PKG) -#define __nvm 1 -#else -#define __nvm 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) -#define __sck 1 -#else -#define __sck 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) && defined (SL_INC_EXT_API) -#define __sck__ext 1 -#else -#define __sck__ext 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) && defined (SL_INC_SOCK_SERVER_SIDE_API) -#define __sck__srv 1 -#else -#define __sck__srv 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) && defined (SL_INC_SOCK_CLIENT_SIDE_API) -#define __sck__clt 1 -#else -#define __sck__clt 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) && defined (SL_INC_SOCK_RECV_API) -#define __sck__rcv 1 -#else -#define __sck__rcv 0 -#endif - -#if defined (SL_INC_SOCKET_PKG) && defined (SL_INC_SOCK_SEND_API) -#define __sck__snd 1 -#else -#define __sck__snd 0 -#endif - -#if defined (SL_INC_WLAN_PKG) -#define __wln 1 -#else -#define __wln 0 -#endif - -#if defined (SL_INC_WLAN_PKG) && defined (SL_INC_EXT_API) -#define __wln__ext 1 -#else -#define __wln__ext 0 -#endif - -/* The return 1 is the function need to be included in the output */ -#define _SL_INCLUDE_FUNC(Name) (_SL_INC_##Name) - -/* Driver */ -#define _SL_INC_sl_NetAppStart __nap - -#define _SL_INC_sl_NetAppStop __nap - -#define _SL_INC_sl_NetAppDnsGetHostByName __nap__clt - - -#define _SL_INC_sl_NetAppDnsGetHostByService __nap__clt -#define _SL_INC_sl_NetAppMDNSRegisterService __nap__clt -#define _SL_INC_sl_NetAppMDNSUnRegisterService __nap__clt -#define _SL_INC_sl_NetAppMDNSRegisterUnregisterService __nap__clt -#define _SL_INC_sl_NetAppGetServiceList __nap__clt - - -#define _SL_INC_sl_DnsGetHostByAddr __nap__ext - -#define _SL_INC_sl_NetAppPingStart __nap - -#define _SL_INC_sl_NetAppPingReport __nap - -/* FS */ -#define _SL_INC_sl_FsOpen __nvm - -#define _SL_INC_sl_FsClose __nvm - -#define _SL_INC_sl_FsRead __nvm - -#define _SL_INC_sl_FsWrite __nvm - -#define _SL_INC_sl_FsGetInfo __nvm - -#define _SL_INC_sl_FsDel __nvm - -/* netcfg */ -#define _SL_INC_sl_MacAdrrSet __ncg - -#define _SL_INC_sl_MacAdrrGet __ncg - -#define _SL_INC_sl_NetCfgGet __ncg - -#define _SL_INC_sl_NetCfgSet __ncg - -#define _SL_INC_sl_NetAppSet __nap - -#define _SL_INC_sl_NetAppGet __nap - -/* socket */ -#define _SL_INC_sl_Socket __sck - -#define _SL_INC_sl_Close __sck__ext - -#define _SL_INC_sl_Accept __sck__srv - -#define _SL_INC_sl_Bind __sck - -#define _SL_INC_sl_Listen __sck__srv - -#define _SL_INC_sl_Connect __sck__clt - -#define _SL_INC_sl_Select __sck - -#define _SL_INC_sl_SetSockOpt __sck - -#define _SL_INC_sl_GetSockOpt __sck__ext - -#define _SL_INC_sl_Recv __sck__rcv - -#define _SL_INC_sl_RecvFrom __sck__rcv - -#define _SL_INC_sl_Write __sck__snd - -#define _SL_INC_sl_Send __sck__snd - -#define _SL_INC_sl_SendTo __sck__snd - -#define _SL_INC_sl_Htonl __sck - -#define _SL_INC_sl_Htons __sck - -/* wlan */ -#define _SL_INC_sl_WlanConnect __wln__ext - -#define _SL_INC_sl_WlanDisconnect __wln__ext - -#define _SL_INC_sl_WlanProfileAdd __wln__ext - -#define _SL_INC_sl_WlanProfileGet __wln__ext - -#define _SL_INC_sl_WlanProfileDel __wln__ext - -#define _SL_INC_sl_WlanPolicySet __wln__ext - -#define _SL_INC_sl_WlanPolicyGet __wln__ext - -#define _SL_INC_sl_WlanGetNetworkList __wln__ext - -#define _SL_INC_sl_WlanRxFilterAdd __wln__ext - -#define _SL_INC_sl_WlanRxFilterSet __wln__ext - -#define _SL_INC_sl_WlanRxFilterGet __wln__ext - -#define _SL_INC_sl_SmartConfigStart __wln - -#define _SL_INC_sl_SmartConfigOptSet __wln__ext - - -#define _SL_INC_sl_WlanSmartConfigStart __wln - -#define _SL_INC_sl_WlanSmartConfigStop __wln - -#define _SL_INC_sl_WlanSetMode __wln - -#define _SL_INC_sl_WlanSet __wln - -#define _SL_INC_sl_WlanGet __wln - -#define _SL_INC_sl_SmartConfigOptSet __wln__ext - -#define _SL_INC_sl_SmartConfigOptGet __wln__ext - -#define _SL_INC_sl_WlanRxStatStart __wln__ext - -#define _SL_INC_sl_WlanRxStatStop __wln__ext - -#define _SL_INC_sl_WlanRxStatGet __wln__ext - - -/* device */ -#define _SL_INC_sl_Task __int__spwn - -#define _SL_INC_sl_Start __dev - -#define _SL_INC_sl_Stop __dev - -#define _SL_INC_sl_StatusGet __dev - -#ifdef SL_IF_TYPE_UART -#define _SL_INC_sl_UartSetMode __dev -#endif - -#define _SL_INC_sl_EventMaskGet __dev__ext - -#define _SL_INC_sl_EventMaskSet __dev__ext - -#define _SL_INC_sl_DevGet __dev__ext - -#define _SL_INC_sl_DevSet __dev__ext - -#endif /*OBJINCLUSION_H_ */ -
--- a/simplelink/cc3100_protocol.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,852 +0,0 @@ -/* - * protocol.h - 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. - * -*/ - -/*******************************************************************************\ -* -* FILE NAME: protocol.h -* -* DESCRIPTION: Constant and data structure definitions and function -* prototypes for the SL protocol module, which implements -* processing of SimpleLink Commands. -* -* AUTHOR: -* -\*******************************************************************************/ - -#ifndef SL_PROTOCOL_TYPES_H_ -#define SL_PROTOCOL_TYPES_H_ - -namespace mbed_cc3100 { - -/**************************************************************************** -** -** User I/F pools definitions -** -****************************************************************************/ - -/**************************************************************************** -** -** Definitions for SimpleLink Commands -** -****************************************************************************/ - - -/* pattern for LE 8/16/32 or BE*/ -#define H2N_SYNC_PATTERN {0xBBDDEEFF,0x4321,0x34,0x12} -#define H2N_CNYS_PATTERN {0xBBDDEEFF,0x8765,0x78,0x56} - -const uint32_t H2N_DUMMY_PATTERN = (uint32_t)0xFFFFFFFF; -const uint32_t N2H_SYNC_PATTERN = (uint32_t)0xABCDDCBA; -const uint32_t SYNC_PATTERN_LEN = (uint32_t)sizeof(uint32_t); -const uint32_t UART_SET_MODE_MAGIC_CODE = (uint32_t)0xAA55AA55; -#define SPI_16BITS_BUG(pattern) (uint32_t)((uint32_t)pattern & (uint32_t)0xFFFF7FFF) -#define SPI_8BITS_BUG(pattern) (uint32_t)((uint32_t)pattern & (uint32_t)0xFFFFFF7F) - - - -typedef struct { - uint16_t Opcode; - uint16_t Len; -} _SlGenericHeader_t; - - -typedef struct { - uint32_t Long; - uint16_t Short; - uint8_t Byte1; - uint8_t Byte2; -} _SlSyncPattern_t; - -typedef _SlGenericHeader_t _SlCommandHeader_t; - -typedef struct { - _SlGenericHeader_t GenHeader; - uint8_t TxPoolCnt; - uint8_t DevStatus; - uint8_t SocketTXFailure; - uint8_t SocketNonBlocking; -} _SlResponseHeader_t; - -#define _SL_RESP_SPEC_HDR_SIZE (sizeof(_SlResponseHeader_t) - sizeof(_SlGenericHeader_t)) -#define _SL_RESP_HDR_SIZE sizeof(_SlResponseHeader_t) -#define _SL_CMD_HDR_SIZE sizeof(_SlCommandHeader_t) - -#define _SL_RESP_ARGS_START(_pMsg) (((_SlResponseHeader_t *)(_pMsg)) + 1) - -/* Used only in NWP! */ -typedef struct { - _SlCommandHeader_t sl_hdr; - uint8_t func_args_start; -} T_SCMD; - - -const uint8_t WLAN_CONN_STATUS_BIT = 0x01; -const uint8_t EVENTS_Q_STATUS_BIT = 0x02; -const uint8_t PENDING_RCV_CMD_BIT = 0x04; -const uint8_t FW_BUSY_PACKETS_BIT = 0x08; - -const uint32_t INIT_STA_OK = 0x11111111; -const uint32_t INIT_STA_ERR = 0x22222222; -const uint32_t INIT_AP_OK = 0x33333333; -const uint32_t INIT_AP_ERR = 0x44444444; -const uint32_t INIT_P2P_OK = 0x55555555; -const uint32_t INIT_P2P_ERR = 0x66666666; - -/**************************************************************************** -** OPCODES -****************************************************************************/ -const uint16_t SL_IPV4_IPV6_OFFSET = ( 9 ); -const uint16_t SL_OPCODE_IPV4 = ( 0x0 << SL_IPV4_IPV6_OFFSET ); -const uint16_t SL_OPCODE_IPV6 = ( 0x1 << SL_IPV4_IPV6_OFFSET ); - -const uint16_t SL_SYNC_ASYNC_OFFSET = ( 10 ); -const uint16_t SL_OPCODE_SYNC = (0x1 << SL_SYNC_ASYNC_OFFSET ); -const uint16_t SL_OPCODE_SILO_OFFSET = ( 11 ); -const uint16_t SL_OPCODE_SILO_MASK = ( 0xF << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_DEVICE = ( 0x0 << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_WLAN = ( 0x1 << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_SOCKET = ( 0x2 << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_NETAPP = ( 0x3 << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_NVMEM = ( 0x4 << SL_OPCODE_SILO_OFFSET ); -const uint16_t SL_OPCODE_SILO_NETCFG = ( 0x5 << SL_OPCODE_SILO_OFFSET ); - -const uint16_t SL_FAMILY_SHIFT = (0x4); -const uint16_t SL_FLAGS_MASK = (0xF); - -const uint16_t SL_OPCODE_DEVICE_INITCOMPLETE = 0x0008; -const uint16_t SL_OPCODE_DEVICE_STOP_COMMAND = 0x8473; -const uint16_t SL_OPCODE_DEVICE_STOP_RESPONSE = 0x0473; -const uint16_t SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE = 0x0073; -const uint16_t SL_OPCODE_DEVICE_DEVICEASYNCDUMMY = 0x0063; - -const uint16_t SL_OPCODE_DEVICE_VERSIONREADCOMMAND = 0x8470; -const uint16_t SL_OPCODE_DEVICE_VERSIONREADRESPONSE = 0x0470; -const uint16_t SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR = 0x0078; -const uint16_t SL_OPCODE_WLAN_WLANCONNECTCOMMAND = 0x8C80; -const uint16_t SL_OPCODE_WLAN_WLANCONNECTRESPONSE = 0x0C80; -const uint16_t SL_OPCODE_WLAN_WLANASYNCCONNECTEDRESPONSE = 0x0880; -const uint16_t SL_OPCODE_WLAN_P2P_DEV_FOUND = 0x0830; -const uint16_t SL_OPCODE_WLAN_CONNECTION_FAILED = 0x0831; -const uint16_t SL_OPCODE_WLAN_P2P_NEG_REQ_RECEIVED = 0x0832; - -const uint16_t SL_OPCODE_WLAN_WLANDISCONNECTCOMMAND = 0x8C81; -const uint16_t SL_OPCODE_WLAN_WLANDISCONNECTRESPONSE = 0x0C81; -const uint16_t SL_OPCODE_WLAN_WLANASYNCDISCONNECTEDRESPONSE = 0x0881; -const uint16_t SL_OPCODE_WLAN_WLANCONNECTEAPCOMMAND = 0x8C82; -const uint16_t SL_OPCODE_WLAN_WLANCONNECTEAPCRESPONSE = 0x0C82; -const uint16_t SL_OPCODE_WLAN_PROFILEADDCOMMAND = 0x8C83; -const uint16_t SL_OPCODE_WLAN_PROFILEADDRESPONSE = 0x0C83; -const uint16_t SL_OPCODE_WLAN_PROFILEGETCOMMAND = 0x8C84; -const uint16_t SL_OPCODE_WLAN_PROFILEGETRESPONSE = 0x0C84; -const uint16_t SL_OPCODE_WLAN_PROFILEDELCOMMAND = 0x8C85; -const uint16_t SL_OPCODE_WLAN_PROFILEDELRESPONSE = 0x0C85; -const uint16_t SL_OPCODE_WLAN_POLICYSETCOMMAND = 0x8C86; -const uint16_t SL_OPCODE_WLAN_POLICYSETRESPONSE = 0x0C86; -const uint16_t SL_OPCODE_WLAN_POLICYGETCOMMAND = 0x8C87; -const uint16_t SL_OPCODE_WLAN_POLICYGETRESPONSE = 0x0C87; -const uint16_t SL_OPCODE_WLAN_FILTERADD = 0x8C88; -const uint16_t SL_OPCODE_WLAN_FILTERADDRESPONSE = 0x0C88; -const uint16_t SL_OPCODE_WLAN_FILTERGET = 0x8C89; -const uint16_t SL_OPCODE_WLAN_FILTERGETRESPONSE = 0x0C89; -const uint16_t SL_OPCODE_WLAN_FILTERDELETE = 0x8C8A; -const uint16_t SL_OPCODE_WLAN_FILTERDELETERESPOSNE = 0x0C8A; -const uint16_t SL_OPCODE_WLAN_WLANGETSTATUSCOMMAND = 0x8C8F; -const uint16_t SL_OPCODE_WLAN_WLANGETSTATUSRESPONSE = 0x0C8F; -const uint16_t SL_OPCODE_WLAN_STARTTXCONTINUESCOMMAND = 0x8CAA; -const uint16_t SL_OPCODE_WLAN_STARTTXCONTINUESRESPONSE = 0x0CAA; -const uint16_t SL_OPCODE_WLAN_STOPTXCONTINUESCOMMAND = 0x8CAB; -const uint16_t SL_OPCODE_WLAN_STOPTXCONTINUESRESPONSE = 0x0CAB; -const uint16_t SL_OPCODE_WLAN_STARTRXSTATCOMMAND = 0x8CAC; -const uint16_t SL_OPCODE_WLAN_STARTRXSTATRESPONSE = 0x0CAC; -const uint16_t SL_OPCODE_WLAN_STOPRXSTATCOMMAND = 0x8CAD; -const uint16_t SL_OPCODE_WLAN_STOPRXSTATRESPONSE = 0x0CAD; -const uint16_t SL_OPCODE_WLAN_GETRXSTATCOMMAND = 0x8CAF; -const uint16_t SL_OPCODE_WLAN_GETRXSTATRESPONSE = 0x0CAF; -const uint16_t SL_OPCODE_WLAN_POLICYSETCOMMANDNEW = 0x8CB0; -const uint16_t SL_OPCODE_WLAN_POLICYSETRESPONSENEW = 0x0CB0; -const uint16_t SL_OPCODE_WLAN_POLICYGETCOMMANDNEW = 0x8CB1; -const uint16_t SL_OPCODE_WLAN_POLICYGETRESPONSENEW = 0x0CB1; - -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_START_COMMAND = 0x8CB2; -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_START_RESPONSE = 0x0CB2; -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_START_ASYNC_RESPONSE = 0x08B2; -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_STOP_COMMAND = 0x8CB3; -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_STOP_RESPONSE = 0x0CB3; -const uint16_t SL_OPCODE_WLAN_SMART_CONFIG_STOP_ASYNC_RESPONSE = 0x08B3; -const uint16_t SL_OPCODE_WLAN_SET_MODE = 0x8CB4; -const uint16_t SL_OPCODE_WLAN_SET_MODE_RESPONSE = 0x0CB4; -const uint16_t SL_OPCODE_WLAN_CFG_SET = 0x8CB5; -const uint16_t SL_OPCODE_WLAN_CFG_SET_RESPONSE = 0x0CB5; -const uint16_t SL_OPCODE_WLAN_CFG_GET = 0x8CB6; -const uint16_t SL_OPCODE_WLAN_CFG_GET_RESPONSE = 0x0CB6; -const uint16_t SL_OPCODE_WLAN_STA_CONNECTED = 0x082E; -const uint16_t SL_OPCODE_WLAN_STA_DISCONNECTED = 0x082F; -const uint16_t SL_OPCODE_WLAN_EAP_PROFILEADDCOMMAND = 0x8C67; -const uint16_t SL_OPCODE_WLAN_EAP_PROFILEADDCOMMAND_RESPONSE = 0x0C67; - -const uint16_t SL_OPCODE_SOCKET_SOCKET = 0x9401; -const uint16_t SL_OPCODE_SOCKET_SOCKETRESPONSE = 0x1401; -const uint16_t SL_OPCODE_SOCKET_CLOSE = 0x9402; -const uint16_t SL_OPCODE_SOCKET_CLOSERESPONSE = 0x1402; -const uint16_t SL_OPCODE_SOCKET_ACCEPT = 0x9403; -const uint16_t SL_OPCODE_SOCKET_ACCEPTRESPONSE = 0x1403; -const uint16_t SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE = 0x1003; -const uint16_t SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE_V6 = 0x1203; -const uint16_t SL_OPCODE_SOCKET_BIND = 0x9404; -const uint16_t SL_OPCODE_SOCKET_BIND_V6 = 0x9604; -const uint16_t SL_OPCODE_SOCKET_BINDRESPONSE = 0x1404; -const uint16_t SL_OPCODE_SOCKET_LISTEN = 0x9405; -const uint16_t SL_OPCODE_SOCKET_LISTENRESPONSE = 0x1405; -const uint16_t SL_OPCODE_SOCKET_CONNECT = 0x9406; -const uint16_t SL_OPCODE_SOCKET_CONNECT_V6 = 0x9606; -const uint16_t SL_OPCODE_SOCKET_CONNECTRESPONSE = 0x1406; -const uint16_t SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE = 0x1006; -const uint16_t SL_OPCODE_SOCKET_SELECT = 0x9407; -const uint16_t SL_OPCODE_SOCKET_SELECTRESPONSE = 0x1407; -const uint16_t SL_OPCODE_SOCKET_SELECTASYNCRESPONSE = 0x1007; -const uint16_t SL_OPCODE_SOCKET_SETSOCKOPT = 0x9408; -const uint16_t SL_OPCODE_SOCKET_SETSOCKOPTRESPONSE = 0x1408; -const uint16_t SL_OPCODE_SOCKET_GETSOCKOPT = 0x9409; -const uint16_t SL_OPCODE_SOCKET_GETSOCKOPTRESPONSE = 0x1409; -const uint16_t SL_OPCODE_SOCKET_RECV = 0x940A; -const uint16_t SL_OPCODE_SOCKET_RECVASYNCRESPONSE = 0x100A; -const uint16_t SL_OPCODE_SOCKET_RECVFROM = 0x940B; -const uint16_t SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE = 0x100B; -const uint16_t SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 = 0x120B; -const uint16_t SL_OPCODE_SOCKET_SEND = 0x940C; -const uint16_t SL_OPCODE_SOCKET_SENDTO = 0x940D; -const uint16_t SL_OPCODE_SOCKET_SENDTO_V6 = 0x960D; -const uint16_t SL_OPCODE_SOCKET_TXFAILEDASYNCRESPONSE = 0x100E; -const uint16_t SL_OPCODE_SOCKET_SOCKETASYNCEVENT = 0x100F; -const uint16_t SL_OPCODE_NETAPP_START_COMMAND = 0x9C0A; -const uint16_t SL_OPCODE_NETAPP_START_RESPONSE = 0x1C0A; -const uint16_t SL_OPCODE_NETAPP_NETAPPSTARTRESPONSE = 0x1C0A; -const uint16_t SL_OPCODE_NETAPP_STOP_COMMAND = 0x9C61; -const uint16_t SL_OPCODE_NETAPP_STOP_RESPONSE = 0x1C61; -const uint16_t SL_OPCODE_NETAPP_NETAPPSET = 0x9C0B; -const uint16_t SL_OPCODE_NETAPP_NETAPPSETRESPONSE = 0x1C0B; -const uint16_t SL_OPCODE_NETAPP_NETAPPGET = 0x9C27; -const uint16_t SL_OPCODE_NETAPP_NETAPPGETRESPONSE = 0x1C27; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYNAME = 0x9C20; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYNAMERESPONSE = 0x1C20; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE = 0x1820; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE_V6 = 0x1A20; -const uint16_t SL_OPCODE_NETAPP_NETAPP_MDNS_LOOKUP_SERVICE = 0x9C71; -const uint16_t SL_OPCODE_NETAPP_NETAPP_MDNS_LOOKUP_SERVICE_RESPONSE = 0x1C72; -const uint16_t SL_OPCODE_NETAPP_MDNSREGISTERSERVICE = 0x9C34; -const uint16_t SL_OPCODE_NETAPP_MDNSREGISTERSERVICERESPONSE = 0x1C34; -const uint16_t SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICE = 0x9C35; -const uint16_t SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICERESPONSE = 0x1C35; -const uint16_t SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE = 0x1835; -const uint16_t SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE_V6 = 0x1A35; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYADDR = 0x9C26; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYADDR_V6 = 0x9E26; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYADDRRESPONSE = 0x1C26; -const uint16_t SL_OPCODE_NETAPP_DNSGETHOSTBYADDRASYNCRESPONSE = 0x1826; -const uint16_t SL_OPCODE_NETAPP_PINGSTART = 0x9C21; -const uint16_t SL_OPCODE_NETAPP_PINGSTART_V6 = 0x9E21; -const uint16_t SL_OPCODE_NETAPP_PINGSTARTRESPONSE = 0x1C21; -const uint16_t SL_OPCODE_NETAPP_PINGREPORTREQUEST = 0x9C22; -const uint16_t SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE = 0x1822; -const uint16_t SL_OPCODE_NETAPP_PINGSTOP = 0x9C23; -const uint16_t SL_OPCODE_NETAPP_PINGSTOPRESPONSE = 0x1C23; -const uint16_t SL_OPCODE_NETAPP_ARPFLUSH = 0x9C24; -const uint16_t SL_OPCODE_NETAPP_ARPFLUSHRESPONSE = 0x1C24; -const uint16_t SL_OPCODE_NETAPP_IPACQUIRED = 0x1825; -const uint16_t SL_OPCODE_NETAPP_IPV4_LOST = 0x1832; -const uint16_t SL_OPCODE_NETAPP_DHCP_IPV4_ACQUIRE_TIMEOUT = 0x1833; -const uint16_t SL_OPCODE_NETAPP_IPACQUIRED_V6 = 0x1A25; -const uint16_t SL_OPCODE_NETAPP_IPERFSTARTCOMMAND = 0x9C28; -const uint16_t SL_OPCODE_NETAPP_IPERFSTARTRESPONSE = 0x1C28; -const uint16_t SL_OPCODE_NETAPP_IPERFSTOPCOMMAND = 0x9C29; -const uint16_t SL_OPCODE_NETAPP_IPERFSTOPRESPONSE = 0x1C29; -const uint16_t SL_OPCODE_NETAPP_CTESTSTARTCOMMAND = 0x9C2A; -const uint16_t SL_OPCODE_NETAPP_CTESTSTARTRESPONSE = 0x1C2A; -const uint16_t SL_OPCODE_NETAPP_CTESTASYNCRESPONSE = 0x182A; -const uint16_t SL_OPCODE_NETAPP_CTESTSTOPCOMMAND = 0x9C2B; -const uint16_t SL_OPCODE_NETAPP_CTESTSTOPRESPONSE = 0x1C2B; -const uint16_t SL_OPCODE_NETAPP_IP_LEASED = 0x182C; -const uint16_t SL_OPCODE_NETAPP_IP_RELEASED = 0x182D; -const uint16_t SL_OPCODE_NETAPP_HTTPGETTOKENVALUE = 0x182E; -const uint16_t SL_OPCODE_NETAPP_HTTPSENDTOKENVALUE = 0x9C2F; -const uint16_t SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE = 0x1830; -const uint16_t SL_OPCODE_NVMEM_FILEOPEN = 0xA43C; -const uint16_t SL_OPCODE_NVMEM_FILEOPENRESPONSE = 0x243C; -const uint16_t SL_OPCODE_NVMEM_FILECLOSE = 0xA43D; -const uint16_t SL_OPCODE_NVMEM_FILECLOSERESPONSE = 0x243D; -const uint16_t SL_OPCODE_NVMEM_FILEREADCOMMAND = 0xA440; -const uint16_t SL_OPCODE_NVMEM_FILEREADRESPONSE = 0x2440; -const uint16_t SL_OPCODE_NVMEM_FILEWRITECOMMAND = 0xA441; -const uint16_t SL_OPCODE_NVMEM_FILEWRITERESPONSE = 0x2441; -const uint16_t SL_OPCODE_NVMEM_FILEGETINFOCOMMAND = 0xA442; -const uint16_t SL_OPCODE_NVMEM_FILEGETINFORESPONSE = 0x2442; -const uint16_t SL_OPCODE_NVMEM_FILEDELCOMMAND = 0xA443; -const uint16_t SL_OPCODE_NVMEM_FILEDELRESPONSE = 0x2443; -const uint16_t SL_OPCODE_NVMEM_NVMEMFORMATCOMMAND = 0xA444; -const uint16_t SL_OPCODE_NVMEM_NVMEMFORMATRESPONSE = 0x2444; - -const uint16_t SL_OPCODE_DEVICE_SETDEBUGLEVELCOMMAND = 0x846A; -const uint16_t SL_OPCODE_DEVICE_SETDEBUGLEVELRESPONSE = 0x046A; - -const uint16_t SL_OPCODE_DEVICE_NETCFG_SET_COMMAND = 0x8432; -const uint16_t SL_OPCODE_DEVICE_NETCFG_SET_RESPONSE = 0x0432; -const uint16_t SL_OPCODE_DEVICE_NETCFG_GET_COMMAND = 0x8433; -const uint16_t SL_OPCODE_DEVICE_NETCFG_GET_RESPONSE = 0x0433; -/* */ -const uint16_t SL_OPCODE_DEVICE_SETUARTMODECOMMAND = 0x846B; -const uint16_t SL_OPCODE_DEVICE_SETUARTMODERESPONSE = 0x046B; -const uint16_t SL_OPCODE_DEVICE_SSISIZESETCOMMAND = 0x846B; -const uint16_t SL_OPCODE_DEVICE_SSISIZESETRESPONSE = 0x046B; - -/* */ -const uint16_t SL_OPCODE_DEVICE_EVENTMASKSET = 0x8464; -const uint16_t SL_OPCODE_DEVICE_EVENTMASKSETRESPONSE = 0x0464; -const uint16_t SL_OPCODE_DEVICE_EVENTMASKGET = 0x8465; -const uint16_t SL_OPCODE_DEVICE_EVENTMASKGETRESPONSE = 0x0465; - -const uint16_t SL_OPCODE_DEVICE_DEVICEGET = 0x8466; -const uint16_t SL_OPCODE_DEVICE_DEVICEGETRESPONSE = 0x0466; -const uint16_t SL_OPCODE_DEVICE_DEVICESET = 0x84B7; -const uint16_t SL_OPCODE_DEVICE_DEVICESETRESPONSE = 0x04B7; - -const uint16_t SL_OPCODE_WLAN_SCANRESULTSGETCOMMAND = 0x8C8C; -const uint16_t SL_OPCODE_WLAN_SCANRESULTSGETRESPONSE = 0x0C8C; -const uint16_t SL_OPCODE_WLAN_SMARTCONFIGOPTSET = 0x8C8D; -const uint16_t SL_OPCODE_WLAN_SMARTCONFIGOPTSETRESPONSE = 0x0C8D; -const uint16_t SL_OPCODE_WLAN_SMARTCONFIGOPTGET = 0x8C8E; -const uint16_t SL_OPCODE_WLAN_SMARTCONFIGOPTGETRESPONSE = 0x0C8E; - -const uint16_t SL_OPCODE_FREE_BSD_RECV_BUFFER = 0xCCCB; -const uint16_t SL_OPCODE_FREE_NON_BSD_READ_BUFFER = 0xCCCD; - - -/* Rx Filters opcodes */ -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERADDCOMMAND = 0x8C6C; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERADDRESPONSE = 0x0C6C; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERSETCOMMAND = 0x8C6D; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERSETRESPONSE = 0x0C6D; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETSTATISTICSINFOCOMMAND = 0x8C6E; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETSTATISTICSINFORESPONSE = 0x0C6E; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETCOMMAND = 0x8C6F; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETRESPONSE = 0x0C6F; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETINFO = 0x8C70; -const uint16_t SL_OPCODE_WLAN_WLANRXFILTERGETINFORESPONSE = 0x0C70; - - -/******************************************************************************************/ -/* Device structs */ -/******************************************************************************************/ -typedef uint32_t InitStatus_t; - - -typedef struct { - int32_t Status; -} InitComplete_t; - -typedef struct { - int16_t status; - uint16_t padding; - -} _BasicResponse_t; - -typedef struct { - uint16_t Timeout; - uint16_t padding; -} _DevStopCommand_t; - -typedef struct { - uint32_t group; - uint32_t mask; -} _DevMaskEventSetCommand_t; - -typedef _BasicResponse_t _DevMaskEventSetResponse_t; - - -typedef struct { - uint32_t group; -} _DevMaskEventGetCommand_t; - - -typedef struct { - uint32_t group; - uint32_t mask; -} _DevMaskEventGetResponse_t; - - -typedef struct { - uint32_t group; -} _DevStatusGetCommand_t; - - -typedef struct { - uint32_t group; - uint32_t status; -} _DevStatusGetResponse_t; - -typedef struct { - uint32_t ChipId; - uint32_t FwVersion[4]; - uint8_t PhyVersion[4]; -} _Device_VersionReadResponsePart_t; - -typedef struct { - _Device_VersionReadResponsePart_t part; - uint32_t NwpVersion[4]; - uint16_t RomVersion; - uint16_t Padding; -} _Device_VersionReadResponseFull_t; - - -typedef struct { - uint32_t BaudRate; - uint8_t FlowControlEnable; -} _DevUartSetModeCommand_t; - -typedef _BasicResponse_t _DevUartSetModeResponse_t; - -/******************************************************/ - -typedef struct { - uint8_t SsiSizeInBytes; - uint8_t Padding[3]; -} _StellarisSsiSizeSet_t; - -/*****************************************************************************************/ -/* WLAN structs */ -/*****************************************************************************************/ -#define MAXIMAL_PASSWORD_LENGTH (64) - -typedef struct { - uint8_t SecType; - uint8_t SsidLen; - uint8_t Bssid[6]; - uint8_t PasswordLen; -} _WlanConnectCommon_t; - -#define SSID_STRING(pCmd) (int8_t *)((_WlanConnectCommon_t *)(pCmd) + 1) -#define PASSWORD_STRING(pCmd) (SSID_STRING(pCmd) + ((_WlanConnectCommon_t *)(pCmd))->SsidLen) - -typedef struct { - _WlanConnectCommon_t Common; - uint8_t UserLen; - uint8_t AnonUserLen; - uint8_t CertIndex; - uint32_t EapBitmask; -} _WlanConnectEapCommand_t; - -#define EAP_SSID_STRING(pCmd) (int8_t *)((_WlanConnectEapCommand_t *)(pCmd) + 1) -#define EAP_PASSWORD_STRING(pCmd) (EAP_SSID_STRING(pCmd) + ((_WlanConnectEapCommand_t *)(pCmd))->Common.SsidLen) -#define EAP_USER_STRING(pCmd) (EAP_PASSWORD_STRING(pCmd) + ((_WlanConnectEapCommand_t *)(pCmd))->Common.PasswordLen) -#define EAP_ANON_USER_STRING(pCmd) (EAP_USER_STRING(pCmd) + ((_WlanConnectEapCommand_t *)(pCmd))->UserLen) - - -typedef struct { - uint8_t PolicyType; - uint8_t Padding; - uint8_t PolicyOption; - uint8_t PolicyOptionLen; -} _WlanPoliciySetGet_t; - - -typedef struct { - uint32_t minDwellTime; - uint32_t maxDwellTime; - uint32_t numProbeResponse; - uint32_t G_Channels_mask; - int32_t rssiThershold; - int32_t snrThershold; - int32_t defaultTXPower; - uint16_t intervalList[16]; -} _WlanScanParamSetCommand_t; - - -typedef struct { - int8_t SecType; - uint8_t SsidLen; - uint8_t Priority; - uint8_t Bssid[6]; - uint8_t PasswordLen; - uint8_t WepKeyId; -} _WlanAddGetProfile_t; - - -typedef struct { - _WlanAddGetProfile_t Common; - uint8_t UserLen; - uint8_t AnonUserLen; - uint8_t CertIndex; - uint16_t padding; - uint32_t EapBitmask; -} _WlanAddGetEapProfile_t; - -#define PROFILE_SSID_STRING(pCmd) ((int8_t *)((_WlanAddGetProfile_t *)(pCmd) + 1)) -#define PROFILE_PASSWORD_STRING(pCmd) (PROFILE_SSID_STRING(pCmd) + ((_WlanAddGetProfile_t *)(pCmd))->SsidLen) - -#define EAP_PROFILE_SSID_STRING(pCmd) (int8_t *)((_WlanAddGetEapProfile_t *)(pCmd) + 1) -#define EAP_PROFILE_PASSWORD_STRING(pCmd) (EAP_PROFILE_SSID_STRING(pCmd) + ((_WlanAddGetEapProfile_t *)(pCmd))->Common.SsidLen) -#define EAP_PROFILE_USER_STRING(pCmd) (EAP_PROFILE_PASSWORD_STRING(pCmd) + ((_WlanAddGetEapProfile_t *)(pCmd))->Common.PasswordLen) -#define EAP_PROFILE_ANON_USER_STRING(pCmd) (EAP_PROFILE_USER_STRING(pCmd) + ((_WlanAddGetEapProfile_t *)(pCmd))->UserLen) - -typedef struct { - uint8_t index; - uint8_t padding[3]; -} _WlanProfileDelGetCommand_t; - -typedef _BasicResponse_t _WlanGetNetworkListResponse_t; - -typedef struct { - uint8_t index; - uint8_t count; - int8_t padding[2]; -} _WlanGetNetworkListCommand_t; - - - - -typedef struct { - uint32_t groupIdBitmask; - uint8_t cipher; - uint8_t publicKeyLen; - uint8_t group1KeyLen; - uint8_t group2KeyLen; -} _WlanSmartConfigStartCommand_t; - -#define SMART_CONFIG_START_PUBLIC_KEY_STRING(pCmd) ((int8_t *)((_WlanSmartConfigStartCommand_t *)(pCmd) + 1)) -#define SMART_CONFIG_START_GROUP1_KEY_STRING(pCmd) ((int8_t *) (SMART_CONFIG_START_PUBLIC_KEY_STRING(pCmd) + ((_WlanSmartConfigStartCommand_t *)(pCmd))->publicKeyLen)) -#define SMART_CONFIG_START_GROUP2_KEY_STRING(pCmd) ((int8_t *) (SMART_CONFIG_START_GROUP1_KEY_STRING(pCmd) + ((_WlanSmartConfigStartCommand_t *)(pCmd))->group1KeyLen)) - -typedef struct { - uint8_t mode; - uint8_t padding[3]; -} _WlanSetMode_t; - - - - -typedef struct { - uint16_t Status; - uint16_t ConfigId; - uint16_t ConfigOpt; - uint16_t ConfigLen; -} _WlanCfgSetGet_t; - - -//wlan_rx_filters moved - -typedef struct { - uint16_t status; - uint8_t WlanRole; /* 0 = station, 2 = AP */ - uint8_t Ipv6Enabled; - uint8_t Ipv6DhcpEnabled; - - uint32_t ipV6Global[4]; - uint32_t ipV6Local[4]; - uint32_t ipV6DnsServer[4]; - uint8_t Ipv6DhcpState; - -} _NetappIpV6configRetArgs_t; - - -typedef struct { - uint8_t ipV4[4]; - uint8_t ipV4Mask[4]; - uint8_t ipV4Gateway[4]; - uint8_t ipV4DnsServer[4]; - uint8_t ipV4Start[4]; - uint8_t ipV4End[4]; -} _NetCfgIpV4AP_Args_t; - - - -typedef struct { - uint16_t status; - uint8_t MacAddr[6]; -} _MAC_Address_SetGet_t; - - -typedef struct { - uint16_t Status; - uint16_t ConfigId; - uint16_t ConfigOpt; - uint16_t ConfigLen; -} _NetCfgSetGet_t; - -typedef struct { - uint16_t Status; - uint16_t DeviceSetId; - uint16_t Option; - uint16_t ConfigLen; -} _DeviceSetGet_t; - - - - -/******************************************************************************************/ -/* Socket structs */ -/******************************************************************************************/ - -typedef struct { - uint8_t Domain; - uint8_t Type; - uint8_t Protocol; - uint8_t Padding; -} _SocketCommand_t; - - -typedef struct { - int16_t statusOrLen; - uint8_t sd; - uint8_t padding; -} _SocketResponse_t; - -typedef struct { - uint8_t sd; - uint8_t family; - uint8_t padding1; - uint8_t padding2; -} _AcceptCommand_t; - - -typedef struct { - int16_t statusOrLen; - uint8_t sd; - uint8_t family; - uint16_t port; - uint16_t paddingOrAddr; - uint32_t address; -} _SocketAddrAsyncIPv4Response_t; - -typedef struct { - int16_t statusOrLen; - uint8_t sd; - uint8_t family; - uint16_t port; - uint8_t address[6]; -} _SocketAddrAsyncIPv6EUI48Response_t; -typedef struct { - int16_t statusOrLen; - uint8_t sd; - uint8_t family; - uint16_t port; - uint16_t paddingOrAddr; - uint32_t address[4]; -} _SocketAddrAsyncIPv6Response_t; - - -typedef struct { - int16_t lenOrPadding; - uint8_t sd; - uint8_t FamilyAndFlags; - uint16_t port; - uint16_t paddingOrAddr; - uint32_t address; -} _SocketAddrIPv4Command_t; - -typedef struct { - int16_t lenOrPadding; - uint8_t sd; - uint8_t FamilyAndFlags; - uint16_t port; - uint8_t address[6]; -} _SocketAddrIPv6EUI48Command_t; -typedef struct { - int16_t lenOrPadding; - uint8_t sd; - uint8_t FamilyAndFlags; - uint16_t port; - uint16_t paddingOrAddr; - uint32_t address[4]; -} _SocketAddrIPv6Command_t; - -typedef union { - _SocketAddrIPv4Command_t IpV4; - _SocketAddrIPv6EUI48Command_t IpV6EUI48; -#ifdef SL_SUPPORT_IPV6 - _SocketAddrIPv6Command_t IpV6; -#endif -} _SocketAddrCommand_u; - -typedef union { - _SocketAddrAsyncIPv4Response_t IpV4; - _SocketAddrAsyncIPv6EUI48Response_t IpV6EUI48; -#ifdef SL_SUPPORT_IPV6 - _SocketAddrAsyncIPv6Response_t IpV6; -#endif -} _SocketAddrResponse_u; - -typedef struct { - uint8_t sd; - uint8_t backlog; - uint8_t padding1; - uint8_t padding2; -} _ListenCommand_t; - -typedef struct { - uint8_t sd; - uint8_t padding0; - uint8_t padding1; - uint8_t padding2; -} _CloseCommand_t; - - -typedef struct { - uint8_t nfds; - uint8_t readFdsCount; - uint8_t writeFdsCount; - uint8_t padding; - uint16_t readFds; - uint16_t writeFds; - uint16_t tv_usec; - uint16_t tv_sec; -} _SelectCommand_t; - - -typedef struct { - uint16_t status; - uint8_t readFdsCount; - uint8_t writeFdsCount; - uint16_t readFds; - uint16_t writeFds; -} _SelectAsyncResponse_t; - -typedef struct { - uint8_t sd; - uint8_t level; - uint8_t optionName; - uint8_t optionLen; -} _setSockOptCommand_t; - -typedef struct { - uint8_t sd; - uint8_t level; - uint8_t optionName; - uint8_t optionLen; -} _getSockOptCommand_t; - -typedef struct { - int16_t status; - uint8_t sd; - uint8_t optionLen; -} _getSockOptResponse_t; - - -typedef struct { - uint16_t StatusOrLen; - uint8_t sd; - uint8_t FamilyAndFlags; -} _sendRecvCommand_t; - -//netapp structs moved - -/***************************************************************************************** -* FS structs -******************************************************************************************/ - -typedef struct { - uint32_t FileHandle; - uint32_t Offset; - uint16_t Len; - uint16_t Padding; -} _FsReadCommand_t; - -typedef struct { - uint32_t Mode; - uint32_t Token; -} _FsOpenCommand_t; - -typedef struct { - uint32_t FileHandle; - uint32_t Token; -} _FsOpenResponse_t; - - -typedef struct { - uint32_t FileHandle; - uint32_t CertificFileNameLength; - uint32_t SignatureLen; -} _FsCloseCommand_t; - - -typedef _BasicResponse_t _FsReadResponse_t; -typedef _BasicResponse_t _FsDeleteResponse_t; -typedef _BasicResponse_t _FsCloseResponse_t; - -typedef struct { - uint16_t Status; - uint16_t flags; - uint32_t FileLen; - uint32_t AllocatedLen; - uint32_t Token[4]; -} _FsGetInfoResponse_t; - -typedef struct { - uint8_t DeviceID; - uint8_t Padding[3]; -} _FsFormatCommand_t; - -typedef _BasicResponse_t _FsFormatResponse_t; - -typedef struct { - uint32_t Token; -} _FsDeleteCommand_t; - -typedef _FsDeleteCommand_t _FsGetInfoCommand_t; - -typedef struct { - uint32_t FileHandle; - uint32_t Offset; - uint16_t Len; - uint16_t Padding; -} _FsWriteCommand_t; - -typedef _BasicResponse_t _FsWriteResponse_t; - - -/* Set Max Async Payload length depending on flavor (Tiny, Small, etc.) */ -#define SL_ASYNC_MAX_PAYLOAD_LEN 160 /* size must be aligned to 4 */ -#define SL_ASYNC_MAX_MSG_LEN (_SL_RESP_HDR_SIZE + SL_ASYNC_MAX_PAYLOAD_LEN) - -#define RECV_ARGS_SIZE (sizeof(_SocketResponse_t)) -#define RECVFROM_IPV4_ARGS_SIZE (sizeof(_SocketAddrAsyncIPv4Response_t)) -#define RECVFROM_IPV6_ARGS_SIZE (sizeof(_SocketAddrAsyncIPv6Response_t)) - -#define SL_IPV4_ADDRESS_SIZE (sizeof(uint32_t)) -#define SL_IPV6_ADDRESS_SIZE (4 * sizeof(uint32_t)) - -}//namespace mbed_cc3100 - -#endif /* _SL_PROTOCOL_TYPES_H_ */ -
--- a/simplelink/cc3100_simplelink.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,580 +0,0 @@ -/* - * simplelink.h - 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. - * -*/ - - -/*! - \mainpage SimpleLink Driver - - \section intro_sec Introduction - - The SimpleLink CC31xx/CC2xx family allows to add Wi-Fi and networking capabilities - to low-cost embedded products without having prior Wi-Fi, RF or networking expertise. - The CC31xx/CC32xx is an ideal solution for microcontroller-based sensor and control - applications such as home appliances, home automation and smart metering. - The CC31xx/CC32xx has integrated a comprehensive TCP/IP network stack, Wi-Fi driver and - security supplicant leading to easier portability to microcontrollers, to an - ultra-low memory footprint, all without compromising the capabilities and robustness - of the final application. - - - - \section modules_sec Module Names - To make it simple, TI's SimpleLink CC31xx/CC32xx platform capabilities were divided into modules by topic (Silo). - These capabilities range from basic device management through wireless - network configuration, standard BSD socket and much more. - Listed below are the various modules in the SimpleLink CC31xx/CC32xx driver: - -# \ref device - controls the behaviour of the CC31xx/CC32xx device (start/stop, events masking and obtaining specific device status) - -# \ref wlan - controls the use of the WiFi WLAN module including: - - Connection features, such as: profiles, policies, SmartConfigďż˝ - - Advanced WLAN features, such as: scans, rx filters and rx statistics collection - -# \ref socket - controls standard client/server sockets programming options and capabilities - -# \ref netapp - activates networking applications, such as: HTTP Server, DHCP Server, Ping, DNS and mDNS. - -# \ref netcfg - controls the configuration of the device addresses (i.e. IP and MAC addresses) - -# \ref FileSystem - provides file system capabilities to TI's CC31XX that can be used by both the CC31XX device and the user. - - - \section proting_sec Porting Guide - - The porting of the SimpleLink driver to any new platform is based on few simple steps. - This guide takes you through this process step by step. Please follow the instructions - carefully to avoid any problems during this process and to enable efficient and proper - work with the device. - Please notice that all modifications and porting adjustments of the driver should be - made in the user.h header file only. - Keep making any of the changes only in this file will ensure smoothly transaction to - new versions of the driver at the future! - - - \subsection porting_step1 Step 1 - Create your own user.h file - - The first step is to create a user.h file that will include your configurations and - adjustments. You can use the empty template provided as part of this driver or - you can choose to base your file on file from one of the wide range of examples - applications provided by Texas Instruments - - - \subsection porting_step2 Step 2 - Select the capabilities set required for your application - - Texas Instruments made a lot of efforts to build set of predefined capability sets that would - fit most of the target application. - It is recommended to try and choose one of this predefined capabilities set before going to - build your own customized set. If you find compatible set you can skip the rest of this step. - - The available sets are: - -# SL_TINY - Compatible to be used on platforms with very limited resources. Provides - the best in class foot print in terms of Code and Data consumption. - -# SL_SMALL - Compatible to most common networking applications. Provide the most - common APIs with decent balance between code size, data size, functionality - and performances - -# SL_FULL - Provide access to all SimpleLink functionalities - - - \subsection porting_step3 Step 3 - Bind the device enable/disable output line - - The enable/disable line (nHib) provide mechanism to enter the device into the least current - consumption mode. This mode could be used when no traffic is required (tx/rx). - when this line is not connected to any IO of the host this define should be left empty. - Not connecting this line results in ability to start the driver only once. - - - \subsection porting_step4 Step 4 - Writing your interface communication driver - - The SimpleLink device support several standard communication protocol among SPI and - UART. Depending on your needs and your hardware design, you should choose the - communication channel type. - The interface for this communication channel should include 4 simple access functions: - -# open - -# close - -# read - -# write - - The way this driver would be implemented is directly effecting the efficiency and - the performances of the SimpleLink device on this platform. - If your system has DMA you should consider to use it in order to increase the utilization - of the communication channel - If you have enough memory resources you should consider using a buffer to increase the - efficiency of the write operations. - - - \subsection porting_step5 Step 5 - Choose your memory management model - - The SimpleLink driver support two memory models: - -# Static (default) - -# Dynamic - - If you choose to work in dynamic model you will have to provide alloc and free functions - to be used by the Simple Link driver otherwise nothing need to be done. - - - \subsection porting_step6 Step 6 - OS adaptation - - The SimpleLink driver could run on two kind of platforms: - -# Non-Os / Single Threaded (default) - -# Multi-Threaded - - If you choose to work in multi-threaded environment under operating system you will have to - provide some basic adaptation routines to allow the driver to protect access to resources - for different threads (locking object) and to allow synchronization between threads (sync objects). - In additional the driver support running without dedicated thread allocated solely to the simple - link driver. If you choose to work in this mode, you should also supply a spawn method that - will enable to run function on a temporary context. - - - \subsection porting_step7 Step 7 - Set your asynchronous event handlers routines - - The SimpleLink device generate asynchronous events in several situations. - These asynchronous events could be masked. - In order to catch these events you have to provide handler routines. - Please notice that if you not provide a handler routine and the event is received, - the driver will drop this event without any indication of this drop. - - - \subsection porting_step8 Step 8 - Run diagnostic tools to validate the correctness of your porting - - The driver is delivered with some porting diagnostic tools to simplify the porting validation process - and to reduce issues latter. It is very important to follow carefully this process. - - The diagnostic process include: - -# Validating Interface Communication Driver - -# Validating OS adaptation layer - -# Validating HW integrity - -# Validating basic work with the device - - - \section sw_license License - - * - * - * 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. - * -*/ - - - -#ifndef SIMPLELINK_H_ -#define SIMPLELINK_H_ - -#include "mbed.h" -#include "cc3100_user.h" - -namespace mbed_cc3100 { - -/*! \attention Async event activation notes - Function prototypes for event callback handlers - Event handler function names should be defined in the user.h file - e.g. - "#define sl_WlanEvtHdlr SLWlanEventHandler" - Indicates all WLAN events are handled by User func "SLWlanEventHandler" - Important notes: - 1. Event handlers cannot activate another SimpleLink API from the event's context - 2. Event's data is valid during event's context. Any application data - which is required for the user application should be copied or marked - into user's variables - 3. It is not recommended to delay the execution of the event callback handler - -*/ - -/*! - - \addtogroup UserEvents - @{ - -*/ - - -/*****************************************************************************/ -/* Macro declarations for Host Driver version */ -/*****************************************************************************/ -#define SL_DRIVER_VERSION "1.0.0.1" -#define SL_MAJOR_VERSION_NUM 1L -#define SL_MINOR_VERSION_NUM 0L -#define SL_VERSION_NUM 0L -#define SL_SUB_VERSION_NUM 1L - - -/*****************************************************************************/ -/* Macro declarations for predefined configurations */ -/*****************************************************************************/ - -#ifdef SL_TINY -#undef SL_INC_ARG_CHECK -#undef SL_INC_EXT_API -#undef SL_INC_SOCK_CLIENT_SIDE_API -#undef SL_INC_SOCK_SEND_API -#undef SL_INC_WLAN_PKG -#undef SL_INC_NET_APP_PKG -#undef SL_INC_NET_CFG_PKG -#undef SL_INC_FS_PKG -#define SL_INC_SOCK_SERVER_SIDE_API -#define SL_INC_SOCK_RECV_API -#define SL_INC_SOCKET_PKG -#endif - -#ifdef SL_SMALL -#undef SL_INC_EXT_API -#undef SL_INC_NET_APP_PKG -#undef SL_INC_NET_CFG_PKG -#undef SL_INC_FS_PKG -#define SL_INC_ARG_CHECK -#define SL_INC_WLAN_PKG -#define SL_INC_SOCKET_PKG -#define SL_INC_SOCK_CLIENT_SIDE_API -#define SL_INC_SOCK_SERVER_SIDE_API -#define SL_INC_SOCK_RECV_API -#define SL_INC_SOCK_SEND_API -#endif - -#ifdef SL_FULL -#define SL_INC_EXT_API -#define SL_INC_NET_APP_PKG -#define SL_INC_NET_CFG_PKG -#define SL_INC_FS_PKG -#define SL_INC_ARG_CHECK -#define SL_INC_WLAN_PKG -#define SL_INC_SOCKET_PKG -#define SL_INC_SOCK_CLIENT_SIDE_API -#define SL_INC_SOCK_SERVER_SIDE_API -#define SL_INC_SOCK_RECV_API -#define SL_INC_SOCK_SEND_API -#endif - -#define SL_RET_CODE_OK (0) -#define SL_RET_CODE_INVALID_INPUT (-2) -#define SL_RET_CODE_SELF_ERROR (-3) -#define SL_RET_CODE_NWP_IF_ERROR (-4) -#define SL_RET_CODE_MALLOC_ERROR (-5) - -#define sl_SyncObjClear(pObj) sl_SyncObjWait(pObj,NON_OS_SYNC_OBJ_SIGNAL_VALUE,NON_OS_SYNC_OBJ_CLEAR_VALUE,SL_OS_NO_WAIT) - -#define SL_MAX_SOCKETS (8) - - -/*****************************************************************************/ -/* Types definitions */ -/*****************************************************************************/ - -typedef void(*_SlSpawnEntryFunc_t)(void* pValue); - -#ifndef NULL -#define NULL (0) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#ifndef OK -#define OK (0) -#endif - -//#ifndef _SL_USER_TYPES -//#define _u8 unsigned char -//#define _i8 signed char - -//#define _u16 unsigned short -//#define _i16 signed short - -//#define _u32 unsigned long -//#define _i32 signed long -//#define _volatile volatile -//#define _const const -//#endif - -typedef uint16_t _SlOpcode_t; -typedef uint8_t _SlArgSize_t; -typedef int16_t _SlDataSize_t; -typedef int16_t _SlReturnVal_t; -}//namespace mbed_cc3100 -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ - -#ifdef SL_PLATFORM_MULTI_THREADED -#include "cc3100_spawn.h" -#else -#include "cc3100_nonos.h" -#endif - - -/* - objInclusion.h and user.h must be included before all api header files - objInclusion.h must be the last arrangement just before including the API header files - since it based on the other configurations to decide which object should be included -*/ -#include "cc3100_objInclusion.h" -#include "cc3100_trace.h" -#include "cc3100_fs.h" -#include "cc3100_socket.h" -#include "cc3100_netapp.h" -#include "cc3100_wlan.h" -#include "cc3100.h" -#include "cc3100_netcfg.h" -#include "cc3100_wlan_rx_filters.h" - -namespace mbed_cc3100 { - -/* Async functions description*/ - -/*! - \brief General async event for inspecting general events - - \param[out] pSlDeviceEvent pointer to SlDeviceEvent_t - - \par - Parameters: \n - <b>pSlDeviceEvent->Event = SL_DEVICE_FATAL_ERROR_EVENT </b> - - pSlDeviceEvent->EventData.deviceEvent fields: - - status: An error code indication from the device - - sender: The sender originator which is based on SlErrorSender_e enum - - \par Example: - \code - printf(General Event Handler - ID=%d Sender=%d\n\n", - pSlDeviceEvent->EventData.deviceEvent.status, // status of the general event - pSlDeviceEvent->EventData.deviceEvent.sender); // sender type - \endcode -*/ -//#if (defined(sl_GeneralEvtHdlr)) -//void sl_GeneralEvtHdlr(SlDeviceEvent_t *pSlDeviceEvent); -//#endif - - -/*! - \brief WLAN Async event handler - - \param[out] pSlWlanEvent pointer to SlWlanEvent_t data - - \par - Parameters: - - - <b>pSlWlanEvent->Event = SL_WLAN_CONNECT_EVENT </b>, STA or P2P client connection indication event - - pSlWlanEvent->EventData.STAandP2PModeWlanConnected main fields: - - ssid_name - - ssid_len - - bssid - - go_peer_device_name - - go_peer_device_name_len - - - <b>pSlWlanEvent->Event = SL_WLAN_DISCONNECT_EVENT </b>, STA or P2P client disconnection event - - pSlWlanEvent->EventData.STAandP2PModeDisconnected main fields: - - ssid_name - - ssid_len - - reason_code - - - <b>pSlWlanEvent->Event = SL_WLAN_STA_CONNECTED_EVENT </b>, AP/P2P(Go) connected STA/P2P(Client) - - pSlWlanEvent->EventData.APModeStaConnected fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_STA_DISCONNECTED_EVENT </b>, AP/P2P(Go) disconnected STA/P2P(Client) - - pSlWlanEvent->EventData.APModestaDisconnected fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_COMPLETE_EVENT </b> - - pSlWlanEvent->EventData.smartConfigStartResponse fields: - - status - - ssid_len - - ssid - - private_token_len - - private_token - - - <b>pSlWlanEvent->Event = SL_WLAN_SMART_CONFIG_STOP_EVENT </b> - - pSlWlanEvent->EventData.smartConfigStopResponse fields: - - status - - - <b>pSlWlanEvent->Event = SL_WLAN_P2P_DEV_FOUND_EVENT </b> - - pSlWlanEvent->EventData.P2PModeDevFound fields: - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - own_ssid_len: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT </b> - - pSlWlanEvent->EventData.P2PModeNegReqReceived fields - - go_peer_device_name - - mac - - go_peer_device_name_len - - wps_dev_password_id - - own_ssid: relevant for event sta-connected only - - - <b>pSlWlanEvent->Event = SL_WLAN_CONNECTION_FAILED_EVENT </b>, P2P only - - pSlWlanEvent->EventData.P2PModewlanConnectionFailure fields: - - status -*/ -//#if (defined(sl_WlanEvtHdlr)) -//void sl_WlanEvtHdlr(SlWlanEvent_t *pSlWlanEvent); -//#endif - - -/*! - \brief NETAPP Async event handler - - \param[out] pSlNetApp pointer to SlNetAppEvent_t data - - \par - Parameters: - - <b>pSlWlanEvent->Event = SL_NETAPP_IPV4_IPACQUIRED_EVENT</b>, IPV4 acquired event - - pSlWlanEvent->EventData.ipAcquiredV4 fields: - - ip - - gateway - - dns - - - <b>pSlWlanEvent->Event = SL_NETAPP_IP_LEASED_EVENT</b>, AP or P2P go dhcp lease event - - pSlWlanEvent->EventData.ipLeased fields: - - ip_address - - lease_time - - mac - - - <b>pSlWlanEvent->Event = SL_NETAPP_IP_RELEASED_EVENT</b>, AP or P2P go dhcp ip release event - - pSlWlanEvent->EventData.ipReleased fields - - ip_address - - mac - - reason - -*/ -//#if (defined(sl_NetAppEvtHdlr)) -//void sl_NetAppEvtHdlr(SlNetAppEvent_t *pSlNetApp); -//#endif - -/*! - \brief Socket Async event handler - - \param[out] pSlSockEvent pointer to SlSockEvent_t data - - \par - Parameters:\n - - <b>pSlSockEvent->Event = SL_SOCKET_TX_FAILED_EVENT</b> - - pSlSockEvent->EventData fields: - - sd - - status - - <b>pSlSockEvent->Event = SL_SOCKET_ASYNC_EVENT</b> - - pSlSockEvent->EventData fields: - - sd - - type: SSL_ACCEPT or RX_FRAGMENTATION_TOO_BIG or OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED - - val - -*/ -//#if (defined(sl_SockEvtHdlr)) -//void sl_SockEvtHdlr(SlSockEvent_t *pSlSockEvent); -//#endif - -/*! - \brief HTTP server async event - - \param[out] pSlHttpServerEvent pointer to SlHttpServerEvent_t - \param[in] pSlHttpServerResponse pointer to SlHttpServerResponse_t - - \par - Parameters: \n - - - <b>pSlHttpServerEvent->Event = SL_NETAPP_HTTPGETTOKENVALUE_EVENT</b> - - pSlHttpServerEvent->EventData fields: - - httpTokenName - - data - - len - - pSlHttpServerResponse->ResponseData fields: - - data - - len - - - <b>pSlHttpServerEvent->Event = SL_NETAPP_HTTPPOSTTOKENVALUE_EVENT</b> - - pSlHttpServerEvent->EventData.httpPostData fields: - - action - - token_name - - token_value - - pSlHttpServerResponse->ResponseData fields: - - data - - len - -*/ -//#if (defined(sl_HttpServerCallback)) -//void sl_HttpServerCallback(SlHttpServerEvent_t *pSlHttpServerEvent, SlHttpServerResponse_t *pSlHttpServerResponse); -//#endif -/*! - - Close the Doxygen group. - @} - - */ - -}//namespace mbed_cc3100 - -#endif /* __SIMPLELINK_H__ */ - -
--- a/simplelink/cc3100_sl_common.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - * sl_config.h - get time sample application - * - * 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. - * - */ - -#ifndef SL_CONFIG_H_ -#define SL_CONFIG_H_ - -//***************************************************************************** -// -// If building with a C++ compiler, make all of the definitions in this header -// have a C binding. -// -//***************************************************************************** - -/**/ - -namespace mbed_cc3100 { - -#define LOOP_FOREVER() \ - {\ - while(1); \ - } - -#define ASSERT_ON_ERROR(error_code) \ - {\ - /* Handling the error-codes is specific to the application */ \ - if (error_code < 0) return error_code; \ - /* else, continue w/ execution */ \ - } - - -/* - * Values for below macros shall be modified per the access-point's (AP) properties - * SimpleLink device will connect to following AP when the application is executed - */ - - -#define SSID_NAME "OpenWrt" /* Access point name to connect to. */ -#define SEC_TYPE SL_SEC_TYPE_WPA_WPA2 /* Security type of the Access point */ -#define PASSKEY "**********" /* Password in case of secure AP */ -#define PASSKEY_LEN strlen(PASSKEY) /* Password length in case of secure AP */ - -/* Configuration of the device when it comes up in AP mode */ -#define SSID_AP_MODE "mysimplelink" /* SSID of the CC3100 in AP mode */ -#define PASSWORD_AP_MODE "" /* Password of CC3100 AP */ -#define SEC_TYPE_AP_MODE SL_SEC_TYPE_OPEN /* Can take SL_SEC_TYPE_WEP or -* SL_SEC_TYPE_WPA as well */ - -/* - * Values for below macros shall be modified based on current time - */ -#define DATE 7 /* Current Date */ -#define MONTH 2 /* Month */ -#define YEAR 2015 /* Current year */ -#define HOUR 10 /* Time - hours */ -#define MINUTE 34 /* Time - minutes */ -#define SECOND 0 /* Time - seconds */ - -#define SUCCESS 0 - -}//namespace mbed_cc3100 - -#endif /*__SL_CONFIG_H__*/ -
--- a/simplelink/cc3100_socket.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,965 +0,0 @@ -/* - * socket.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_socket.h" - -namespace mbed_cc3100 { - - -cc3100_socket::cc3100_socket(cc3100_driver &driver, cc3100_nonos &nonos) - : _driver(driver), _nonos(nonos) -{ - -} - -cc3100_socket::~cc3100_socket() -{ - -} - -/*******************************************************************************/ -/* Functions */ -/*******************************************************************************/ - -/* ******************************************************************************/ -/* _sl_BuildAddress */ -/* ******************************************************************************/ -void cc3100_socket::_sl_BuildAddress(const SlSockAddr_t *addr, int16_t addrlen, _SocketAddrCommand_u *pCmd) -{ - /* Note: parsing of family and port in the generic way for all IPV4, IPV6 and EUI48 */ - /* is possible as int32_t as these parameters are in the same offset and size for these */ - /* three families. */ - pCmd->IpV4.FamilyAndFlags = (addr->sa_family << 4) & 0xF0; - pCmd->IpV4.port = ((SlSockAddrIn_t *)addr)->sin_port; - - if(SL_AF_INET == addr->sa_family) { - pCmd->IpV4.address = ((SlSockAddrIn_t *)addr)->sin_addr.s_addr; - } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) { - memcpy( pCmd->IpV6EUI48.address,((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, 6); - } -#ifdef SL_SUPPORT_IPV6 - else { - memcpy(pCmd->IpV6.address, ((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, 16 ); - } -#endif -} - -/* ******************************************************************************/ -/* _sl_TruncatePayloadByProtocol */ -/* ******************************************************************************/ -uint16_t cc3100_socket::_sl_TruncatePayloadByProtocol(const int16_t sd,const uint16_t length) -{ - uint16_t maxLength; - - switch(sd & SL_SOCKET_PAYLOAD_TYPE_MASK) { - case SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4: - maxLength = 1472; - break; - - case SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4: - maxLength = 1460; - break; - - case SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6: - maxLength = 1452; - break; - - case SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6: - maxLength = 1440; - break; - case SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4_SECURE: - case SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4_SECURE: - maxLength = 1402; - break; - case SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6_SECURE: - case SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6_SECURE: - maxLength = 1396; - break; - case SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER: - maxLength = 1476; - break; - case SL_SOCKET_PAYLOAD_TYPE_RAW_PACKET: - maxLength = 1514; - break; - case SL_SOCKET_PAYLOAD_TYPE_RAW_IP4: - maxLength = 1480; - break; - default: - maxLength = 1440; - break; - } - - if( length > maxLength ) { - return maxLength; - } else { - return length; - } -} - -/*******************************************************************************/ -/* _sl_ParseAddress */ -/*******************************************************************************/ -void cc3100_socket::_sl_ParseAddress(_SocketAddrResponse_u *pRsp, SlSockAddr_t *addr, SlSocklen_t *addrlen) -{ - /* Note: parsing of family and port in the generic way for all IPV4, IPV6 and EUI48 */ - /* is possible as long as these parameters are in the same offset and size for these */ - /* three families. */ - addr->sa_family = pRsp->IpV4.family; - ((SlSockAddrIn_t *)addr)->sin_port = pRsp->IpV4.port; - - *addrlen = (SL_AF_INET == addr->sa_family) ? sizeof(SlSockAddrIn_t) : sizeof(SlSockAddrIn6_t); - - if(SL_AF_INET == addr->sa_family) { - ((SlSockAddrIn_t *)addr)->sin_addr.s_addr = pRsp->IpV4.address; - } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) { - memcpy(((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, pRsp->IpV6EUI48.address, 6); - } -#ifdef SL_SUPPORT_IPV6 - else { - memcpy(((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, pRsp->IpV6.address, 16); - } -#endif -} - -/*******************************************************************************/ -/* sl_Socket */ -/*******************************************************************************/ -typedef union { - uint32_t Dummy; - _SocketCommand_t Cmd; - _SocketResponse_t Rsp; -} _SlSockSocketMsg_u; - -const _SlCmdCtrl_t _SlSockSocketCmdCtrl = { - SL_OPCODE_SOCKET_SOCKET, - sizeof(_SocketCommand_t), - sizeof(_SocketResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_Socket) -int16_t cc3100_socket::sl_Socket(int16_t Domain, int16_t Type, int16_t Protocol) -{ - _SlSockSocketMsg_u Msg; - - Msg.Cmd.Domain = (uint8_t)Domain; - Msg.Cmd.Type = (uint8_t)Type; - Msg.Cmd.Protocol = (uint8_t)Protocol; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSockSocketCmdCtrl, &Msg, NULL)); - - if( Msg.Rsp.statusOrLen < 0 ) { - return( Msg.Rsp.statusOrLen ); - } else { - return (int16_t)((uint8_t)Msg.Rsp.sd); - } -} -#endif - -/*******************************************************************************/ -/* sl_Close */ -/*******************************************************************************/ -typedef union { - _CloseCommand_t Cmd; - _SocketResponse_t Rsp; -} _SlSockCloseMsg_u; - -const _SlCmdCtrl_t _SlSockCloseCmdCtrl = { - SL_OPCODE_SOCKET_CLOSE, - sizeof(_CloseCommand_t), - sizeof(_SocketResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_Close) -int16_t cc3100_socket::sl_Close(int16_t sd) -{ - _SlSockCloseMsg_u Msg; - - Msg.Cmd.sd = (uint8_t)sd; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSockCloseCmdCtrl, &Msg, NULL)); - - return Msg.Rsp.statusOrLen; -} -#endif - -/*******************************************************************************/ -/* sl_Bind */ -/*******************************************************************************/ -typedef union { - _SocketAddrCommand_u Cmd; - _SocketResponse_t Rsp; -} _SlSockBindMsg_u; - -#if _SL_INCLUDE_FUNC(sl_Bind) -int16_t cc3100_socket::sl_Bind(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen) -{ - _SlSockBindMsg_u Msg; - _SlCmdCtrl_t CmdCtrl = {0, 0, sizeof(_SocketResponse_t)}; - - switch(addr->sa_family) { - case SL_AF_INET : - CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t); - break; - case SL_AF_INET6_EUI_48: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t); - break; -#ifdef SL_SUPPORT_IPV6 - case AF_INET6: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t); - break; -#endif - case SL_AF_RF : - default: - return SL_RET_CODE_INVALID_INPUT; - } - - Msg.Cmd.IpV4.lenOrPadding = 0; - Msg.Cmd.IpV4.sd = (uint8_t)sd; - - _sl_BuildAddress(addr, addrlen, &Msg.Cmd); - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL)); - - return Msg.Rsp.statusOrLen; -} -#endif - -/*******************************************************************************/ -/* sl_Sendto */ -/*******************************************************************************/ -typedef union { - _SocketAddrCommand_u Cmd; - /* no response for 'sendto' commands*/ -} _SlSendtoMsg_u; - -#if _SL_INCLUDE_FUNC(sl_SendTo) -int16_t cc3100_socket::sl_SendTo(int16_t sd, const void *pBuf, int16_t Len, int16_t flags, const SlSockAddr_t *to, SlSocklen_t tolen) -{ - _SlSendtoMsg_u Msg; - _SlCmdCtrl_t CmdCtrl = {0, 0, 0}; - _SlCmdExt_t CmdExt; - uint16_t ChunkLen; - int16_t RetVal; - - CmdExt.TxPayloadLen = (uint16_t)Len; - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (unsigned char *)pBuf; - CmdExt.pRxPayload = NULL; - - - switch(to->sa_family) { - case SL_AF_INET: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t); - break; - case SL_AF_INET6_EUI_48: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_BIND_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t); - break; -#ifdef SL_SUPPORT_IPV6 - case AF_INET6: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_SENDTO_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t); - break; -#endif - case SL_AF_RF: - default: - return SL_RET_CODE_INVALID_INPUT; - } - - ChunkLen = _sl_TruncatePayloadByProtocol(sd,Len); - Msg.Cmd.IpV4.lenOrPadding = ChunkLen; - CmdExt.TxPayloadLen = ChunkLen; - - Msg.Cmd.IpV4.sd = (unsigned char)sd; - - _sl_BuildAddress(to, tolen, &Msg.Cmd); - - Msg.Cmd.IpV4.FamilyAndFlags |= flags & 0x0F; - - do { - RetVal = _driver._SlDrvDataWriteOp((_SlSd_t)sd, &CmdCtrl, &Msg, &CmdExt); - - if(SL_OS_RET_CODE_OK == RetVal) { - CmdExt.pTxPayload += ChunkLen; - ChunkLen = (uint16_t)((unsigned char *)pBuf + Len - CmdExt.pTxPayload); - ChunkLen = _sl_TruncatePayloadByProtocol(sd,ChunkLen); - CmdExt.TxPayloadLen = ChunkLen; - Msg.Cmd.IpV4.lenOrPadding = ChunkLen; - } else { - return RetVal; - } - } while(ChunkLen > 0); - - return (int16_t)Len; -} -#endif - -/*******************************************************************************/ -/* sl_Recvfrom */ -/*******************************************************************************/ -typedef union { - _sendRecvCommand_t Cmd; - _SocketAddrResponse_u Rsp; -} _SlRecvfromMsg_u; - -const _SlCmdCtrl_t _SlRecvfomCmdCtrl = { - SL_OPCODE_SOCKET_RECVFROM, - sizeof(_sendRecvCommand_t), - sizeof(_SocketAddrResponse_u) -}; - -#if _SL_INCLUDE_FUNC(sl_RecvFrom) -int16_t cc3100_socket::sl_RecvFrom(int16_t sd, void *buf, int16_t Len, int16_t flags, SlSockAddr_t *from, SlSocklen_t *fromlen) -{ - _SlRecvfromMsg_u Msg; - _SlCmdExt_t CmdExt; - int16_t RetVal; - - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = Len; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t *)buf; - - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.StatusOrLen = Len; - /* no size truncation in recv path */ - CmdExt.RxPayloadLen = Msg.Cmd.StatusOrLen; - - if(sizeof(SlSockAddrIn_t) == *fromlen) { - Msg.Cmd.FamilyAndFlags = SL_AF_INET; - } else if (sizeof(SlSockAddrIn6_t) == *fromlen) { - Msg.Cmd.FamilyAndFlags = SL_AF_INET6; - } else { - return SL_RET_CODE_INVALID_INPUT; - } - - Msg.Cmd.FamilyAndFlags = (Msg.Cmd.FamilyAndFlags << 4) & 0xF0; - Msg.Cmd.FamilyAndFlags |= flags & 0x0F; - - RetVal = _driver._SlDrvDataReadOp((_SlSd_t)sd, (_SlCmdCtrl_t *)&_SlRecvfomCmdCtrl, &Msg, &CmdExt); - if( RetVal != SL_OS_RET_CODE_OK ) { - return RetVal; - } - - RetVal = Msg.Rsp.IpV4.statusOrLen; - - if(RetVal >= 0) { - VERIFY_PROTOCOL(sd == Msg.Rsp.IpV4.sd); -#if 0 - _sl_ParseAddress(&Msg.Rsp, from, fromlen); -#else - from->sa_family = Msg.Rsp.IpV4.family; - if(SL_AF_INET == from->sa_family) { - ((SlSockAddrIn_t *)from)->sin_port = Msg.Rsp.IpV4.port; - ((SlSockAddrIn_t *)from)->sin_addr.s_addr = Msg.Rsp.IpV4.address; - *fromlen = sizeof(SlSockAddrIn_t); - } else if (SL_AF_INET6_EUI_48 == from->sa_family ) { - ((SlSockAddrIn6_t *)from)->sin6_port = Msg.Rsp.IpV6EUI48.port; - memcpy(((SlSockAddrIn6_t *)from)->sin6_addr._S6_un._S6_u8, Msg.Rsp.IpV6EUI48.address, 6); - } -#ifdef SL_SUPPORT_IPV6 - else if(AF_INET6 == from->sa_family) { - VERIFY_PROTOCOL(*fromlen >= sizeof(sockaddr_in6)); - - ((sockaddr_in6 *)from)->sin6_port = Msg.Rsp.IpV6.port; - memcpy(((sockaddr_in6 *)from)->sin6_addr._S6_un._S6_u32, Msg.Rsp.IpV6.address, 16); - *fromlen = sizeof(sockaddr_in6); - } -#endif -#endif - } - - return (int16_t)RetVal; -} -#endif - -/*******************************************************************************/ -/* sl_Connect */ -/*******************************************************************************/ -typedef union { - _SocketAddrCommand_u Cmd; - _SocketResponse_t Rsp; -} _SlSockConnectMsg_u; - -#if _SL_INCLUDE_FUNC(sl_Connect) -int16_t cc3100_socket::sl_Connect(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen) -{ - _SlSockConnectMsg_u Msg; - _SlReturnVal_t RetVal; - _SlCmdCtrl_t CmdCtrl = {0, 0, sizeof(_SocketResponse_t)}; - _SocketResponse_t AsyncRsp; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - - switch(addr->sa_family) { - case SL_AF_INET : - CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv4Command_t); - break; - case SL_AF_INET6_EUI_48: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6EUI48Command_t); - break; -#ifdef SL_SUPPORT_IPV6 - case AF_INET6: - CmdCtrl.Opcode = SL_OPCODE_SOCKET_CONNECT_V6; - CmdCtrl.TxDescLen = sizeof(_SocketAddrIPv6Command_t); - break; -#endif - case SL_AF_RF : - default: - return SL_RET_CODE_INVALID_INPUT; - } - - Msg.Cmd.IpV4.lenOrPadding = 0; - Msg.Cmd.IpV4.sd = (uint8_t)sd; - - _sl_BuildAddress(addr, addrlen, &Msg.Cmd); - - /* Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(CONNECT_ID, (uint8_t)(sd & BSD_SOCKET_ID_MASK)); - - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - - /* send the command */ - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL)); - VERIFY_PROTOCOL(Msg.Rsp.sd == sd) - - RetVal = Msg.Rsp.statusOrLen; - - if(SL_RET_CODE_OK == RetVal) { - /* wait for async and get Data Read parameters */ - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_PROTOCOL(AsyncRsp.sd == sd); - - RetVal = AsyncRsp.statusOrLen; - } - _driver._SlDrvReleasePoolObj(ObjIdx); - return RetVal; -} -#endif - -/*******************************************************************************/ -/* sl_Send */ -/*******************************************************************************/ -typedef union { - _sendRecvCommand_t Cmd; - /* no response for 'sendto' commands*/ -} _SlSendMsg_u; - -const _SlCmdCtrl_t _SlSendCmdCtrl = { - SL_OPCODE_SOCKET_SEND, - sizeof(_sendRecvCommand_t), - 0 -}; - -#if _SL_INCLUDE_FUNC(sl_Send) -int16_t cc3100_socket::sl_Send(int16_t sd, const void *pBuf, int16_t Len, int16_t flags) -{ - _SlSendMsg_u Msg; - _SlCmdExt_t CmdExt; - uint16_t ChunkLen; - int16_t RetVal; - uint32_t tempVal; - uint8_t runSingleChunk = FALSE; - - CmdExt.TxPayloadLen = Len; - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)pBuf; - - /* Only for RAW transceiver type socket, relay the flags parameter in the 2 bytes (4 byte aligned) before the actual payload */ - if ((sd & SL_SOCKET_PAYLOAD_TYPE_MASK) == SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER) { - tempVal = flags; - CmdExt.pRxPayload = (uint8_t *)&tempVal; - CmdExt.RxPayloadLen = 4; - g_pCB->RelayFlagsViaRxPayload = TRUE; - runSingleChunk = TRUE; - } else { - CmdExt.pRxPayload = NULL; - } - - ChunkLen = _sl_TruncatePayloadByProtocol(sd,Len); - CmdExt.TxPayloadLen = ChunkLen; - - Msg.Cmd.StatusOrLen = ChunkLen; - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.FamilyAndFlags |= flags & 0x0F; - - do { - RetVal = _driver._SlDrvDataWriteOp((uint8_t)sd, (_SlCmdCtrl_t *)&_SlSendCmdCtrl, &Msg, &CmdExt); - if(SL_OS_RET_CODE_OK == RetVal) { - CmdExt.pTxPayload += ChunkLen; - ChunkLen = (uint8_t *)pBuf + Len - CmdExt.pTxPayload; - ChunkLen = _sl_TruncatePayloadByProtocol(sd,ChunkLen); - CmdExt.TxPayloadLen = ChunkLen; - Msg.Cmd.StatusOrLen = ChunkLen; - } else { - return RetVal; - } - } while((ChunkLen > 0) && (runSingleChunk==FALSE)); - - return (int16_t)Len; -} -#endif - -/*******************************************************************************/ -/* sl_Listen */ -/*******************************************************************************/ -typedef union { - _ListenCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlListenMsg_u; - -const _SlCmdCtrl_t _SlListenCmdCtrl = { - SL_OPCODE_SOCKET_LISTEN, - sizeof(_ListenCommand_t), - sizeof(_BasicResponse_t), -}; - -#if _SL_INCLUDE_FUNC(sl_Listen) -int16_t cc3100_socket::sl_Listen(int16_t sd, int16_t backlog) -{ - _SlListenMsg_u Msg; - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.backlog = (uint8_t)backlog; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlListenCmdCtrl, &Msg, NULL)); - - return (int16_t)Msg.Rsp.status; -} -#endif - -/*******************************************************************************/ -/* sl_Accept */ -/*******************************************************************************/ -typedef union { - _AcceptCommand_t Cmd; - _SocketResponse_t Rsp; -} _SlSockAcceptMsg_u; - -const _SlCmdCtrl_t _SlAcceptCmdCtrl = { - SL_OPCODE_SOCKET_ACCEPT, - sizeof(_AcceptCommand_t), - sizeof(_BasicResponse_t), -}; - -#if _SL_INCLUDE_FUNC(sl_Accept) -int16_t cc3100_socket::sl_Accept(int16_t sd, SlSockAddr_t *addr, SlSocklen_t *addrlen) -{ - _SlSockAcceptMsg_u Msg; - _SlReturnVal_t RetVal; - _SocketAddrResponse_u AsyncRsp; - - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.family = (sizeof(SlSockAddrIn_t) == *addrlen) ? SL_AF_INET : SL_AF_INET6; - - /* Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(ACCEPT_ID, (uint8_t)(sd & BSD_SOCKET_ID_MASK)); - - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - /* send the command */ - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlAcceptCmdCtrl, &Msg, NULL)); - VERIFY_PROTOCOL(Msg.Rsp.sd == sd); - - RetVal = Msg.Rsp.statusOrLen; - - if(SL_OS_RET_CODE_OK == RetVal) { - /* wait for async and get Data Read parameters */ - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - - VERIFY_PROTOCOL(AsyncRsp.IpV4.sd == sd); - - RetVal = AsyncRsp.IpV4.statusOrLen; - if( (NULL != addr) && (NULL != addrlen) ) { -#if 0 /* Kept for backup */ - _sl_ParseAddress(&AsyncRsp, addr, addrlen); -#else - addr->sa_family = AsyncRsp.IpV4.family; - - if(SL_AF_INET == addr->sa_family) { - if( *addrlen == sizeof( SlSockAddrIn_t ) ) { - ((SlSockAddrIn_t *)addr)->sin_port = AsyncRsp.IpV4.port; - ((SlSockAddrIn_t *)addr)->sin_addr.s_addr = AsyncRsp.IpV4.address; - } else { - *addrlen = 0; - } - } else if (SL_AF_INET6_EUI_48 == addr->sa_family ) { - if( *addrlen == sizeof( SlSockAddrIn6_t ) ) { - ((SlSockAddrIn6_t *)addr)->sin6_port = AsyncRsp.IpV6EUI48.port ; - /* will be called from here and from _sl_BuildAddress*/ - memcpy(((SlSockAddrIn6_t *)addr)->sin6_addr._S6_un._S6_u8, AsyncRsp.IpV6EUI48.address, 6); - } else { - *addrlen = 0; - } - } -#ifdef SL_SUPPORT_IPV6 - else { - if( *addrlen == sizeof( sockaddr_in6 ) ) { - ((sockaddr_in6 *)addr)->sin6_port = AsyncRsp.IpV6.port ; - memcpy(((sockaddr_in6 *)addr)->sin6_addr._S6_un._S6_u32, AsyncRsp.IpV6.address, 16); - } else { - *addrlen = 0; - } - } -#endif -#endif - } - } - - _driver._SlDrvReleasePoolObj(ObjIdx); - return (int16_t)RetVal; -} -#endif - - -/*******************************************************************************/ -/* sl_Htonl */ -/*******************************************************************************/ -uint32_t cc3100_socket::sl_Htonl( uint32_t val ) -{ - uint32_t i = 1; - int8_t *p = (int8_t *)&i; - if (p[0] == 1) { /* little endian */ - p[0] = ((int8_t* )&val)[3]; - p[1] = ((int8_t* )&val)[2]; - p[2] = ((int8_t* )&val)[1]; - p[3] = ((int8_t* )&val)[0]; - return i; - } else { /* big endian */ - return val; - } -} - -/*******************************************************************************/ -/* sl_Htonl */ -/*******************************************************************************/ -uint16_t cc3100_socket::sl_Htons( uint16_t val ) -{ - int16_t i = 1; - int8_t *p = (int8_t *)&i; - if (p[0] == 1) { /* little endian */ - p[0] = ((int8_t* )&val)[1]; - p[1] = ((int8_t* )&val)[0]; - return i; - } else { /* big endian */ - return val; - } -} - -/*******************************************************************************/ -/* sl_Recv */ -/*******************************************************************************/ -typedef union { - _sendRecvCommand_t Cmd; - _SocketResponse_t Rsp; -} _SlRecvMsg_u; - -const _SlCmdCtrl_t _SlRecvCmdCtrl = { - SL_OPCODE_SOCKET_RECV, - sizeof(_sendRecvCommand_t), - sizeof(_SocketResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_Recv) -int16_t cc3100_socket::sl_Recv(int16_t sd, void *pBuf, int16_t Len, int16_t flags) -{ - _SlRecvMsg_u Msg; - _SlCmdExt_t CmdExt; - _SlReturnVal_t status; - - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = Len; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t *)pBuf; - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.StatusOrLen = Len; - - /* no size truncation in recv path */ - CmdExt.RxPayloadLen = Msg.Cmd.StatusOrLen; - - Msg.Cmd.FamilyAndFlags = flags & 0x0F; - - status = _driver._SlDrvDataReadOp((_SlSd_t)sd, (_SlCmdCtrl_t *)&_SlRecvCmdCtrl, &Msg, &CmdExt); - if( status != SL_OS_RET_CODE_OK ) { - return status; - } - - /* if the Device side sends less than expected it is not the Driver's role */ - /* the returned value could be smaller than the requested size */ - return (int16_t)Msg.Rsp.statusOrLen; -} -#endif - -/*******************************************************************************/ -/* sl_SetSockOpt */ -/*******************************************************************************/ -typedef union { - _setSockOptCommand_t Cmd; - _SocketResponse_t Rsp; -} _SlSetSockOptMsg_u; - -const _SlCmdCtrl_t _SlSetSockOptCmdCtrl = { - SL_OPCODE_SOCKET_SETSOCKOPT, - sizeof(_setSockOptCommand_t), - sizeof(_SocketResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_SetSockOpt) -int16_t cc3100_socket::sl_SetSockOpt(int16_t sd, int16_t level, int16_t optname, const void *optval, SlSocklen_t optlen) -{ - _SlSetSockOptMsg_u Msg; - _SlCmdExt_t CmdExt; - - CmdExt.TxPayloadLen = optlen; - CmdExt.RxPayloadLen = 0; - CmdExt.pTxPayload = (uint8_t *)optval; - CmdExt.pRxPayload = NULL; - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.level = (uint8_t)level; - Msg.Cmd.optionLen = (uint8_t)optlen; - Msg.Cmd.optionName = (uint8_t)optname; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSetSockOptCmdCtrl, &Msg, &CmdExt)); - - return (int16_t)Msg.Rsp.statusOrLen; -} -#endif - -/*******************************************************************************/ -/* sl_GetSockOpt */ -/*******************************************************************************/ -typedef union { - _getSockOptCommand_t Cmd; - _getSockOptResponse_t Rsp; -} _SlGetSockOptMsg_u; - -const _SlCmdCtrl_t _SlGetSockOptCmdCtrl = { - SL_OPCODE_SOCKET_GETSOCKOPT, - sizeof(_getSockOptCommand_t), - sizeof(_getSockOptResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_GetSockOpt) -int16_t cc3100_socket::sl_GetSockOpt(int16_t sd, int16_t level, int16_t optname, void *optval, SlSocklen_t *optlen) -{ - _SlGetSockOptMsg_u Msg; - _SlCmdExt_t CmdExt; - - if (*optlen == 0) { - return SL_EZEROLEN; - } - CmdExt.TxPayloadLen = 0; - CmdExt.RxPayloadLen = *optlen; - CmdExt.pTxPayload = NULL; - CmdExt.pRxPayload = (uint8_t*)optval; - CmdExt.ActualRxPayloadLen = 0; - - Msg.Cmd.sd = (uint8_t)sd; - Msg.Cmd.level = (uint8_t)level; - Msg.Cmd.optionLen = (uint8_t)(*optlen); - Msg.Cmd.optionName = (uint8_t)optname; - - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlGetSockOptCmdCtrl, &Msg, &CmdExt)); - - if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen) { - *optlen = Msg.Rsp.optionLen; - return SL_ESMALLBUF; - } else { - *optlen = (uint8_t)CmdExt.ActualRxPayloadLen; - } - return (int16_t)Msg.Rsp.status; -} -#endif - -/*******************************************************************************/ -/* sl_Select */ -/* ******************************************************************************/ -typedef union { - _SelectCommand_t Cmd; - _BasicResponse_t Rsp; -} _SlSelectMsg_u; - -const _SlCmdCtrl_t _SlSelectCmdCtrl = { - SL_OPCODE_SOCKET_SELECT, - sizeof(_SelectCommand_t), - sizeof(_BasicResponse_t) -}; - -#if _SL_INCLUDE_FUNC(sl_Select) -int16_t cc3100_socket::sl_Select(int16_t nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, SlTimeval_t *timeout) -{ - _SlSelectMsg_u Msg; - _SelectAsyncResponse_t AsyncRsp; - uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS; - - Msg.Cmd.nfds = (uint8_t)nfds; - Msg.Cmd.readFdsCount = 0; - Msg.Cmd.writeFdsCount = 0; - - Msg.Cmd.readFds = 0; - Msg.Cmd.writeFds = 0; - - if( readsds ) { - Msg.Cmd.readFds = (uint16_t)readsds->fd_array[0]; - } - if( writesds ) { - Msg.Cmd.writeFds = (uint16_t)writesds->fd_array[0]; - } - if( NULL == timeout ) { - Msg.Cmd.tv_sec = 0xffff; - Msg.Cmd.tv_usec = 0xffff; - } else { - if( 0xffff <= timeout->tv_sec ) { - Msg.Cmd.tv_sec = 0xffff; - } else { - Msg.Cmd.tv_sec = (uint16_t)timeout->tv_sec; - } - timeout->tv_usec = timeout->tv_usec >> 10; /* convert to milliseconds */ - if( 0xffff <= timeout->tv_usec ) { - Msg.Cmd.tv_usec = 0xffff; - } else { - Msg.Cmd.tv_usec = (uint16_t)timeout->tv_usec; - } - } - - /* Use Obj to issue the command, if not available try later */ - ObjIdx = (uint8_t)_driver._SlDrvWaitForPoolObj(SELECT_ID, SL_MAX_SOCKETS); - - if (MAX_CONCURRENT_ACTIONS == ObjIdx) { - return SL_POOL_IS_EMPTY; - } - OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE, NON_OS_LOCK_OBJ_LOCK_VALUE, SL_OS_WAIT_FOREVER)); - - g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&AsyncRsp; - - OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj, NON_OS_LOCK_OBJ_UNLOCK_VALUE)); - /* send the command */ - VERIFY_RET_OK(_driver._SlDrvCmdOp((_SlCmdCtrl_t *)&_SlSelectCmdCtrl, &Msg, NULL)); - - if(SL_OS_RET_CODE_OK == (int16_t)Msg.Rsp.status) { - OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, NON_OS_SYNC_OBJ_SIGNAL_VALUE, NON_OS_SYNC_OBJ_CLEAR_VALUE, SL_OS_WAIT_FOREVER)); - Msg.Rsp.status = AsyncRsp.status; - - if( ((int16_t)Msg.Rsp.status) >= 0 ) { - if( readsds ) { - readsds->fd_array[0] = AsyncRsp.readFds; - } - if( writesds ) { - writesds->fd_array[0] = AsyncRsp.writeFds; - } - } - } - - _driver._SlDrvReleasePoolObj(ObjIdx); - return (int16_t)Msg.Rsp.status; -} - -/* Select helper functions */ -/*******************************************************************************/ -/* SL_FD_SET */ -/* ******************************************************************************/ -void cc3100_socket::SL_FD_SET(int16_t fd, SlFdSet_t *fdset) -{ - fdset->fd_array[0] |= (1<< (fd & BSD_SOCKET_ID_MASK)); -} -/*******************************************************************************/ -/* SL_FD_CLR */ -/*******************************************************************************/ -void cc3100_socket::SL_FD_CLR(int16_t fd, SlFdSet_t *fdset) -{ - fdset->fd_array[0] &= ~(1<< (fd & BSD_SOCKET_ID_MASK)); -} -/*******************************************************************************/ -/* SL_FD_ISSET */ -/*******************************************************************************/ -int16_t cc3100_socket::SL_FD_ISSET(int16_t fd, SlFdSet_t *fdset) -{ - if( fdset->fd_array[0] & (1<< (fd & BSD_SOCKET_ID_MASK)) ) { - return 1; - } - return 0; -} -/*******************************************************************************/ -/* SL_FD_ZERO */ -/*******************************************************************************/ -void cc3100_socket::SL_FD_ZERO(SlFdSet_t *fdset) -{ - fdset->fd_array[0] = 0; -} - -#endif - -}//namespace mbed_cc3100 - - -
--- a/simplelink/cc3100_socket.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1498 +0,0 @@ -/* - * socket.h - 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. - * -*/ - -#ifndef SL_SOCKET_H_ -#define SL_SOCKET_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ -#include "cc3100_simplelink.h" -#include "cc3100_protocol.h" - -namespace mbed_cc3100 { - -//#include "cc3100_driver.h" - -/*! - - \addtogroup socket - @{ - -*/ - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -const uint8_t SL_FD_SETSIZE = SL_MAX_SOCKETS; /* Number of sockets to select on - same is max sockets! */ -const uint8_t BSD_SOCKET_ID_MASK = (0x0F); /* Index using the LBS 4 bits for socket id 0-7 */ -/* Define some BSD protocol constants. */ -const uint8_t SL_SOCK_STREAM = (1); /* TCP Socket */ -const uint8_t SL_SOCK_DGRAM = (2); /* UDP Socket */ -const uint8_t SL_SOCK_RAW = (3); /* Raw socket */ -const uint8_t SL_IPPROTO_TCP = (6); /* TCP Raw Socket */ -const uint8_t SL_IPPROTO_UDP = (17); /* UDP Raw Socket */ -const uint8_t SL_IPPROTO_RAW = (255); /* Raw Socket */ -const uint8_t SL_SEC_SOCKET = (100); /* Secured Socket Layer (SSL,TLS) */ - -/* Address families. */ -const uint8_t SL_AF_INET = (2); /* IPv4 socket (UDP, TCP, etc) */ -const uint8_t SL_AF_INET6 = (3); /* IPv6 socket (UDP, TCP, etc) */ -const uint8_t SL_AF_INET6_EUI_48 = (9); -const uint8_t AF_INET = SL_AF_INET; -const uint8_t AF_INET6 = SL_AF_INET6; -const uint8_t SL_AF_RF = (6); /* data include RF parameter, All layer by user (Wifi could be disconnected) */ -const uint8_t SL_AF_PACKET = (17); -/* Protocol families, same as address families. */ -const uint8_t SL_PF_INET = AF_INET; -const uint8_t SL_PF_INET6 = AF_INET6; -const uint8_t SL_INADDR_ANY = (0); /* bind any address */ - -/* error codes */ -const int8_t SL_SOC_ERROR = (-1); /* Failure. */ -const int8_t SL_SOC_OK = ( 0); /* Success. */ -const int8_t SL_INEXE = (-8); /* socket command in execution */ -const int8_t SL_EBADF = (-9); /* Bad file number */ -const int8_t SL_ENSOCK = (-10); /* The system limit on the total number of open socket, has been reached */ -const int8_t SL_EAGAIN = (-11); /* Try again */ -const int8_t SL_EWOULDBLOCK = SL_EAGAIN; -const int8_t SL_ENOMEM = (-12); /* Out of memory */ -const int8_t SL_EACCES = (-13); /* Permission denied */ -const int8_t SL_EFAULT = (-14); /* Bad address */ -const int8_t SL_ECLOSE = (-15); /* close socket operation failed to transmit all queued packets */ -const int8_t SL_EALREADY_ENABLED = (-21); /* Transceiver - Transceiver already ON. there could be only one */ -const int8_t SL_EINVAL = (-22); /* Invalid argument */ -const int8_t SL_EAUTO_CONNECT_OR_CONNECTING = (-69); /* Transceiver - During connection, connected or auto mode started */ -const int8_t SL_CONNECTION_PENDING = (-72); /* Transceiver - Device is connected, disconnect first to open transceiver */ -const int8_t SL_EUNSUPPORTED_ROLE = (-86); /* Transceiver - Trying to start when WLAN role is AP or P2P GO */ -const int8_t SL_EDESTADDRREQ = (-89); /* Destination address required */ -const int8_t SL_EPROTOTYPE = (-91); /* Protocol wrong type for socket */ -const int8_t SL_ENOPROTOOPT = (-92); /* Protocol not available */ -const int8_t SL_EPROTONOSUPPORT = (-93); /* Protocol not supported */ -const int8_t SL_ESOCKTNOSUPPORT = (-94); /* Socket type not supported */ -const int8_t SL_EOPNOTSUPP = (-95); /* Operation not supported on transport endpoint */ -const int8_t SL_EAFNOSUPPORT = (-97); /* Address family not supported by protocol */ -const int8_t SL_EADDRINUSE = (-98); /* Address already in use */ -const int8_t SL_EADDRNOTAVAIL = (-99); /* Cannot assign requested address */ -const int8_t SL_ENETUNREACH = (-101); /* Network is unreachable */ -const int8_t SL_ENOBUFS = (-105); /* No buffer space available */ -const int8_t SL_EOBUFF = SL_ENOBUFS; -const int8_t SL_EISCONN = (-106); /* Transport endpoint is already connected */ -const int8_t SL_ENOTCONN = (-107); /* Transport endpoint is not connected */ -const int8_t SL_ETIMEDOUT = (-110); /* Connection timed out */ -const int8_t SL_ECONNREFUSED = (-111); /* Connection refused */ -const int8_t SL_EALREADY = (-114); /* Non blocking connect in progress, try again */ - -const int16_t SL_ESEC_RSA_WRONG_TYPE_E = (-130); /* RSA wrong block type for RSA function */ -const int16_t SL_ESEC_RSA_BUFFER_E = (-131); /* RSA buffer error, output too small or */ -const int16_t SL_ESEC_BUFFER_E = (-132); /* output buffer too small or input too large */ -const int16_t SL_ESEC_ALGO_ID_E = (-133); /* setting algo id error */ -const int16_t SL_ESEC_PUBLIC_KEY_E = (-134); /* setting public key error */ -const int16_t SL_ESEC_DATE_E = (-135); /* setting date validity error */ -const int16_t SL_ESEC_SUBJECT_E = (-136); /* setting subject name error */ -const int16_t SL_ESEC_ISSUER_E = (-137); /* setting issuer name error */ -const int16_t SL_ESEC_CA_TRUE_E = (-138); /* setting CA basic constraint true error */ -const int16_t SL_ESEC_EXTENSIONS_E = (-139); /* setting extensions error */ -const int16_t SL_ESEC_ASN_PARSE_E = (-140); /* ASN parsing error, invalid input */ -const int16_t SL_ESEC_ASN_VERSION_E = (-141); /* ASN version error, invalid number */ -const int16_t SL_ESEC_ASN_GETINT_E = (-142); /* ASN get big int16_t error, invalid data */ -const int16_t SL_ESEC_ASN_RSA_KEY_E = (-143); /* ASN key init error, invalid input */ -const int16_t SL_ESEC_ASN_OBJECT_ID_E = (-144); /* ASN object id error, invalid id */ -const int16_t SL_ESEC_ASN_TAG_NULL_E = (-145); /* ASN tag error, not null */ -const int16_t SL_ESEC_ASN_EXPECT_0_E = (-146); /* ASN expect error, not zero */ -const int16_t SL_ESEC_ASN_BITSTR_E = (-147); /* ASN bit string error, wrong id */ -const int16_t SL_ESEC_ASN_UNKNOWN_OID_E = (-148); /* ASN oid error, unknown sum id */ -const int16_t SL_ESEC_ASN_DATE_SZ_E = (-149); /* ASN date error, bad size */ -const int16_t SL_ESEC_ASN_BEFORE_DATE_E = (-150); /* ASN date error, current date before */ -const int16_t SL_ESEC_ASN_AFTER_DATE_E = (-151); /* ASN date error, current date after */ -const int16_t SL_ESEC_ASN_SIG_OID_E = (-152); /* ASN signature error, mismatched oid */ -const int16_t SL_ESEC_ASN_TIME_E = (-153); /* ASN time error, unknown time type */ -const int16_t SL_ESEC_ASN_INPUT_E = (-154); /* ASN input error, not enough data */ -const int16_t SL_ESEC_ASN_SIG_CONFIRM_E = (-155); /* ASN sig error, confirm failure */ -const int16_t SL_ESEC_ASN_SIG_HASH_E = (-156); /* ASN sig error, unsupported hash type */ -const int16_t SL_ESEC_ASN_SIG_KEY_E = (-157); /* ASN sig error, unsupported key type */ -const int16_t SL_ESEC_ASN_DH_KEY_E = (-158); /* ASN key init error, invalid input */ -const int16_t SL_ESEC_ASN_NTRU_KEY_E = (-159); /* ASN ntru key decode error, invalid input */ -const int16_t SL_ESEC_ECC_BAD_ARG_E = (-170); /* ECC input argument of wrong type */ -const int16_t SL_ESEC_ASN_ECC_KEY_E = (-171); /* ASN ECC bad input */ -const int16_t SL_ESEC_ECC_CURVE_OID_E = (-172); /* Unsupported ECC OID curve type */ -const int16_t SL_ESEC_BAD_FUNC_ARG = (-173); /* Bad function argument provided */ -const int16_t SL_ESEC_NOT_COMPILED_IN = (-174); /* Feature not compiled in */ -const int16_t SL_ESEC_UNICODE_SIZE_E = (-175); /* Unicode password too big */ -const int16_t SL_ESEC_NO_PASSWORD = (-176); /* no password provided by user */ -const int16_t SL_ESEC_ALT_NAME_E = (-177); /* alt name size problem, too big */ -const int16_t SL_ESEC_AES_GCM_AUTH_E = (-180); /* AES-GCM Authentication check failure */ -const int16_t SL_ESEC_AES_CCM_AUTH_E = (-181); /* AES-CCM Authentication check failure */ -/* ssl tls security start with -300 offset */ -const int16_t SL_ESEC_CLOSE_NOTIFY = (-300); /* ssl/tls alerts */ -const int16_t SL_ESEC_UNEXPECTED_MESSAGE = (-310); /* ssl/tls alerts */ -const int16_t SL_ESEC_BAD_RECORD_MAC = (-320); /* ssl/tls alerts */ -const int16_t SL_ESEC_DECRYPTION_FAILED = (-321); /* ssl/tls alerts */ -const int16_t SL_ESEC_RECORD_OVERFLOW = (-322); /* ssl/tls alerts */ -const int16_t SL_ESEC_DECOMPRESSION_FAILURE = (-330); /* ssl/tls alerts */ -const int16_t SL_ESEC_HANDSHAKE_FAILURE = (-340); /* ssl/tls alerts */ -const int16_t SL_ESEC_NO_CERTIFICATE = (-341); /* ssl/tls alerts */ -const int16_t SL_ESEC_BAD_CERTIFICATE = (-342); /* ssl/tls alerts */ -const int16_t SL_ESEC_UNSUPPORTED_CERTIFICATE = (-343); /* ssl/tls alerts */ -const int16_t SL_ESEC_CERTIFICATE_REVOKED = (-344); /* ssl/tls alerts */ -const int16_t SL_ESEC_CERTIFICATE_EXPIRED = (-345); /* ssl/tls alerts */ -const int16_t SL_ESEC_CERTIFICATE_UNKNOWN = (-346); /* ssl/tls alerts */ -const int16_t SL_ESEC_ILLEGAL_PARAMETER = (-347); /* ssl/tls alerts */ -const int16_t SL_ESEC_UNKNOWN_CA = (-348); /* ssl/tls alerts */ -const int16_t SL_ESEC_ACCESS_DENIED = (-349); /* ssl/tls alerts */ -const int16_t SL_ESEC_DECODE_ERROR = (-350); /* ssl/tls alerts */ -const int16_t SL_ESEC_DECRYPT_ERROR = (-351); /* ssl/tls alerts */ -const int16_t SL_ESEC_EXPORT_RESTRICTION = (-360); /* ssl/tls alerts */ -const int16_t SL_ESEC_PROTOCOL_VERSION = (-370); /* ssl/tls alerts */ -const int16_t SL_ESEC_INSUFFICIENT_SECURITY = (-371); /* ssl/tls alerts */ -const int16_t SL_ESEC_INTERNAL_ERROR = (-380); /* ssl/tls alerts */ -const int16_t SL_ESEC_USER_CANCELLED = (-390); /* ssl/tls alerts */ -const int16_t SL_ESEC_NO_RENEGOTIATION = (-400); /* ssl/tls alerts */ -const int16_t SL_ESEC_UNSUPPORTED_EXTENSION = (-410); /* ssl/tls alerts */ -const int16_t SL_ESEC_CERTIFICATE_UNOBTAINABLE = (-411); /* ssl/tls alerts */ -const int16_t SL_ESEC_UNRECOGNIZED_NAME = (-412); /* ssl/tls alerts */ -const int16_t SL_ESEC_BAD_CERTIFICATE_STATUS_RESPONSE = (-413); /* ssl/tls alerts */ -const int16_t SL_ESEC_BAD_CERTIFICATE_HASH_VALUE = (-414); /* ssl/tls alerts */ -/* propierty secure */ -const int16_t SL_ESECGENERAL = (-450); /* error secure level general error */ -const int16_t SL_ESECDECRYPT = (-451); /* error secure level, decrypt recv packet fail */ -const int16_t SL_ESECCLOSED = (-452); /* secure layrer is closed by other size , tcp is still connected */ -const int16_t SL_ESECSNOVERIFY = (-453); /* Connected without server verification */ -const int16_t SL_ESECNOCAFILE = (-454); /* error secure level CA file not found*/ -const int16_t SL_ESECMEMORY = (-455); /* error secure level No memory space available */ -const int16_t SL_ESECBADCAFILE = (-456); /* error secure level bad CA file */ -const int16_t SL_ESECBADCERTFILE = (-457); /* error secure level bad Certificate file */ -const int16_t SL_ESECBADPRIVATEFILE = (-458); /* error secure level bad private file */ -const int16_t SL_ESECBADDHFILE = (-459); /* error secure level bad DH file */ -const int16_t SL_ESECT00MANYSSLOPENED = (-460); /* MAX SSL Sockets are opened */ -const int16_t SL_ESECDATEERROR = (-461); /* connected with certificate date verification error */ -const int16_t SL_ESECHANDSHAKETIMEDOUT = (-462); /* connection timed out due to handshake time */ - -/* end error codes */ - -/* Max payload size by protocol */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_MASK = (0xF0); /*4 bits type, 4 bits sockets id */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4 = (0x00); /* 1472 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4 = (0x10); /* 1460 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6 = (0x20); /* 1452 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6 = (0x30); /* 1440 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV4_SECURE =(0x40); /* */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV4_SECURE =(0x50); /* */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_UDP_IPV6_SECURE =(0x60); /* */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_TCP_IPV6_SECURE =(0x70); /* */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_TRANCEIVER =(0x80); /* 1536 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_PACKET = (0x90); /* 1536 bytes */ -const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 = (0xa0); -const uint8_t SL_SOCKET_PAYLOAD_TYPE_RAW_IP6 = (SL_SOCKET_PAYLOAD_TYPE_RAW_IP4 ); - - - -const uint8_t SL_SOL_SOCKET = (1); /* Define the socket option category. */ -const uint8_t SL_IPPROTO_IP = (2); /* Define the IP option category. */ -const uint8_t SL_SOL_PHY_OPT = (3); /* Define the PHY option category. */ - -const uint8_t SL_SO_RCVBUF = (8); /* Setting TCP receive buffer size */ -const uint8_t SL_SO_KEEPALIVE = (9); /* Connections are kept alive with periodic messages */ -const uint8_t SL_SO_RCVTIMEO = (20); /* Enable receive timeout */ -const uint8_t SL_SO_NONBLOCKING = (24); /* Enable . disable nonblocking mode */ -const uint8_t SL_SO_SECMETHOD = (25); /* security metohd */ -const uint8_t SL_SO_SECURE_MASK = (26); /* security mask */ -const uint8_t SL_SO_SECURE_FILES = (27); /* security files */ -const uint8_t SL_SO_CHANGE_CHANNEL = (28); /* This option is available only when transceiver started */ -const uint8_t SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME =(30); /* This option used to configue secure file */ -const uint8_t SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME =(31); /* This option used to configue secure file */ -const uint8_t SL_SO_SECURE_FILES_CA_FILE_NAME = (32); /* This option used to configue secure file */ -const uint8_t SL_SO_SECURE_FILES_DH_KEY_FILE_NAME = (33); /* This option used to configue secure file */ - -const uint8_t SL_IP_MULTICAST_IF = (60); /* Specify outgoing multicast interface */ -const uint8_t SL_IP_MULTICAST_TTL = (61); /* Specify the TTL value to use for outgoing multicast packet. */ -const uint8_t SL_IP_ADD_MEMBERSHIP = (65); /* Join IPv4 multicast membership */ -const uint8_t SL_IP_DROP_MEMBERSHIP= (66); /* Leave IPv4 multicast membership */ -const uint8_t SL_IP_HDRINCL = (67); /* Raw socket IPv4 header included. */ -const uint8_t SL_IP_RAW_RX_NO_HEADER =(68); /* Proprietary socket option that does not includeIPv4/IPv6 header (and extension headers) on received raw sockets*/ -const uint8_t SL_IP_RAW_IPV6_HDRINCL =(69); /* Transmitted buffer over IPv6 socket contains IPv6 header. */ - -const uint8_t SL_SO_PHY_RATE = (100); /* WLAN Transmit rate */ -const uint8_t SL_SO_PHY_TX_POWER = (101); /* TX Power level */ -const uint8_t SL_SO_PHY_NUM_FRAMES_TO_TX = (102); /* Number of frames to transmit */ -const uint8_t SL_SO_PHY_PREAMBLE = (103); /* Preamble for transmission */ - -const uint8_t SL_SO_SEC_METHOD_SSLV3 = (0); /* security metohd SSL v3*/ -const uint8_t SL_SO_SEC_METHOD_TLSV1 = (1); /* security metohd TLS v1*/ -const uint8_t SL_SO_SEC_METHOD_TLSV1_1 = (2); /* security metohd TLS v1_1*/ -const uint8_t SL_SO_SEC_METHOD_TLSV1_2 = (3); /* security metohd TLS v1_2*/ -const uint8_t SL_SO_SEC_METHOD_SSLv3_TLSV1_2 = (4); /* use highest possible version from SSLv3 - TLS 1.2*/ -const uint8_t SL_SO_SEC_METHOD_DLSV1 = (5); /* security metohd DTL v1 */ - -#define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA (1 << 0) -#define SL_SEC_MASK_SSL_RSA_WITH_RC4_128_MD5 (1 << 1) -#define SL_SEC_MASK_TLS_RSA_WITH_AES_256_CBC_SHA (1 << 2) -#define SL_SEC_MASK_TLS_DHE_RSA_WITH_AES_256_CBC_SHA (1 << 3) -#define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (1 << 4) -#define SL_SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_SHA (1 << 5) -#define SL_SEC_MASK_SECURE_DEFAULT ((SL_SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_SHA << 1) - 1) /*Is this var name correct? was SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_SHA*/ - -const uint32_t SL_MSG_DONTWAIT = (0x00000008); /* Nonblocking IO */ - -/* AP DHCP Server - IP Release reason code */ -const uint8_t SL_IP_LEASE_PEER_RELEASE = (0); -const uint8_t SL_IP_LEASE_PEER_DECLINE = (1); -const uint8_t SL_IP_LEASE_EXPIRED = (2); - -/* possible types when receiving SL_SOCKET_ASYNC_EVENT*/ -const uint8_t SSL_ACCEPT = (1); /* accept failed due to ssl issue ( tcp pass) */ -const uint8_t RX_FRAGMENTATION_TOO_BIG = (2); /* connection less mode, rx packet fragmentation > 16K, packet is being released */ -const uint8_t OTHER_SIDE_CLOSE_SSL_DATA_NOT_ENCRYPTED = (3); /* remote side down from secure to unsecure */ - - - -#ifdef SL_INC_STD_BSD_API_NAMING - -#define FD_SETSIZE SL_FD_SETSIZE - -#define SOCK_STREAM SL_SOCK_STREAM -#define SOCK_DGRAM SL_SOCK_DGRAM -#define SOCK_RAW SL_SOCK_RAW -#define IPPROTO_TCP SL_IPPROTO_TCP -#define IPPROTO_UDP SL_IPPROTO_UDP -#define IPPROTO_RAW SL_IPPROTO_RAW - -#define AF_INET6_EUI_48 SL_AF_INET6_EUI_48 -#define AF_RF SL_AF_RF -#define AF_PACKET SL_AF_PACKET - -#define PF_INET SL_PF_INET -#define PF_INET6 SL_PF_INET6 - -#define INADDR_ANY SL_INADDR_ANY -#define ERROR SL_SOC_ERROR -#define INEXE SL_INEXE -#define EBADF SL_EBADF -#define ENSOCK SL_ENSOCK -#define EAGAIN SL_EAGAIN -#define EWOULDBLOCK SL_EWOULDBLOCK -#define ENOMEM SL_ENOMEM -#define EACCES SL_EACCES -#define EFAULT SL_EFAULT -#define EINVAL SL_EINVAL -#define EDESTADDRREQ SL_EDESTADDRREQ -#define EPROTOTYPE SL_EPROTOTYPE -#define ENOPROTOOPT SL_ENOPROTOOPT -#define EPROTONOSUPPORT SL_EPROTONOSUPPORT -#define ESOCKTNOSUPPORT SL_ESOCKTNOSUPPORT -#define EOPNOTSUPP SL_EOPNOTSUPP -#define EAFNOSUPPORT SL_EAFNOSUPPORT -#define EADDRINUSE SL_EADDRINUSE -#define EADDRNOTAVAIL SL_EADDRNOTAVAIL -#define ENETUNREACH SL_ENETUNREACH -#define ENOBUFS SL_ENOBUFS -#define EOBUFF SL_EOBUFF -#define EISCONN SL_EISCONN -#define ENOTCONN SL_ENOTCONN -#define ETIMEDOUT SL_ETIMEDOUT -#define ECONNREFUSED SL_ECONNREFUSED - -#define SOL_SOCKET SL_SOL_SOCKET -#define IPPROTO_IP SL_IPPROTO_IP -#define SO_KEEPALIVE SL_SO_KEEPALIVE - -#define SO_RCVTIMEO SL_SO_RCVTIMEO -#define SO_NONBLOCKING SL_SO_NONBLOCKING - -#define IP_MULTICAST_IF SL_IP_MULTICAST_IF -#define IP_MULTICAST_TTL SL_IP_MULTICAST_TTL -#define IP_ADD_MEMBERSHIP SL_IP_ADD_MEMBERSHIP -#define IP_DROP_MEMBERSHIP SL_IP_DROP_MEMBERSHIP - -#define socklen_t SlSocklen_t -#define timeval SlTimeval_t -#define sockaddr SlSockAddr_t -#define in6_addr SlIn6Addr_t -#define sockaddr_in6 SlSockAddrIn6_t -#define in_addr SlInAddr_t -#define sockaddr_in SlSockAddrIn_t - -#define MSG_DONTWAIT SL_MSG_DONTWAIT - -#define FD_SET SL_FD_SET -#define FD_CLR SL_FD_CLR -#define FD_ISSET SL_FD_ISSET -#define FD_ZERO SL_FD_ZERO -#define fd_set SlFdSet_t - -#define socket sl_Socket -#define close sl_Close -#define accept sl_Accept -#define bind sl_Bind -#define listen sl_Listen -#define connect sl_Connect -#define select sl_Select -#define setsockopt sl_SetSockOpt -#define getsockopt sl_GetSockOpt -#define recv sl_Recv -#define recvfrom sl_RecvFrom -#define write_ sl_Write -#define send sl_Send -#define sendto sl_SendTo -#define gethostbyname sl_NetAppDnsGetHostByName -#define htonl sl_Htonl -#define ntohl sl_Ntohl -#define htons sl_Htons -#define ntohs sl_Ntohs -#endif - - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ - -/* Internet address */ -typedef struct SlInAddr_t { -#ifndef s_addr - uint32_t s_addr; /* Internet address 32 bits */ -#else - union S_un { - struct { - uint8_t s_b1,s_b2,s_b3,s_b4; - } S_un_b; - struct { - uint8_t s_w1,s_w2; - } S_un_w; - uint32_t S_addr; - } S_un; -#endif -} SlInAddr_t; - - -/* sockopt */ -typedef struct { - uint32_t KeepaliveEnabled; /* 0 = disabled;1 = enabled; default = 1*/ -} SlSockKeepalive_t; - -typedef struct { - uint32_t ReuseaddrEnabled; /* 0 = disabled; 1 = enabled; default = 1*/ -} SlSockReuseaddr_t; - -typedef struct { - uint32_t Winsize; /* receive window size for tcp sockets */ -} SlSockWinsize_t; - -typedef struct { - uint32_t NonblockingEnabled;/* 0 = disabled;1 = enabled;default = 1*/ -} SlSockNonblocking_t; - -typedef struct { - uint8_t sd; - uint8_t type; - uint16_t val; -} SlSocketAsyncEvent_t; - -typedef struct { - int16_t status; - uint16_t sd; - SlSocketAsyncEvent_t socketAsyncEvent; -} SlSockEventData_t; - - -typedef struct { - uint32_t Event; - SlSockEventData_t EventData; -} SlSockEvent_t; - - -typedef struct { - uint32_t secureMask; -} SlSockSecureMask; - -typedef struct { - uint8_t secureMethod; -} SlSockSecureMethod; - -typedef enum { - SL_BSD_SECURED_PRIVATE_KEY_IDX = 0, - SL_BSD_SECURED_CERTIFICATE_IDX, - SL_BSD_SECURED_CA_IDX, - SL_BSD_SECURED_DH_IDX -} slBsd_secureSocketFilesIndex_e; - -typedef struct { - SlInAddr_t imr_multiaddr; /* The IPv4 multicast address to join */ - SlInAddr_t imr_interface; /* The interface to use for this group */ -} SlSockIpMreq; - - -/* sockopt */ -typedef uint32_t SlTime_t; -typedef uint32_t SlSuseconds_t; - -typedef struct { - SlTime_t tv_sec; /* Seconds */ - SlSuseconds_t tv_usec; /* Microseconds */ -} SlTimeval_t; - -typedef uint16_t SlSocklen_t; - -/* IpV4 socket address */ -typedef struct { - uint16_t sa_family; /* Address family (e.g. , AF_INET) */ - uint8_t sa_data[14]; /* Protocol- specific address information*/ -} SlSockAddr_t; - - -/* IpV6 or Ipv6 EUI64 */ -typedef struct { - union { - uint8_t _S6_u8[16]; - uint32_t _S6_u32[4]; - } _S6_un; -} SlIn6Addr_t; - -typedef struct { - uint16_t sin6_family; /* AF_INET6 || AF_INET6_EUI_48*/ - uint16_t sin6_port; /* Transport layer port. */ - uint32_t sin6_flowinfo; /* IPv6 flow information. */ - SlIn6Addr_t sin6_addr; /* IPv6 address. */ - uint32_t sin6_scope_id; /* set of interfaces for a scope. */ -} SlSockAddrIn6_t; - -/* Socket address, Internet style. */ - -typedef struct { - uint16_t sin_family; /* Internet Protocol (AF_INET). */ - uint16_t sin_port; /* Address port (16 bits). */ - SlInAddr_t sin_addr; /* Internet address (32 bits). */ - int8_t sin_zero[8]; /* Not used. */ -} SlSockAddrIn_t; - -typedef struct { - uint32_t ip; - uint32_t gateway; - uint32_t dns; -} SlIpV4AcquiredAsync_t; - -typedef struct { - uint32_t type; - uint32_t ip[4]; - uint32_t gateway[4]; - uint32_t dns[4]; -} SlIpV6AcquiredAsync_t; - -typedef struct { - uint32_t ip_address; - uint32_t lease_time; - uint8_t mac[6]; - uint16_t padding; -} SlIpLeasedAsync_t; - -typedef struct { - uint32_t ip_address; - uint8_t mac[6]; - uint16_t reason; -} SlIpReleasedAsync_t; - - -typedef union { - SlIpV4AcquiredAsync_t ipAcquiredV4; /*SL_NETAPP_IPV4_IPACQUIRED_EVENT*/ - SlIpV6AcquiredAsync_t ipAcquiredV6; /*SL_NETAPP_IPV6_IPACQUIRED_EVENT*/ - uint32_t sd; /*SL_SOCKET_TX_FAILED_EVENT*/ - SlIpLeasedAsync_t ipLeased; /* SL_NETAPP_IP_LEASED_EVENT */ - SlIpReleasedAsync_t ipReleased; /* SL_NETAPP_IP_RELEASED_EVENT */ -} SlNetAppEventData_u; - -typedef struct { - uint32_t Event; - SlNetAppEventData_u EventData; -} SlNetAppEvent_t; - - -typedef struct sock_secureFiles { - uint8_t secureFiles[4]; -} SlSockSecureFiles_t; - - -typedef struct SlFdSet_t { /* The select socket array manager */ - uint32_t fd_array[(SL_FD_SETSIZE + 31)/32]; /* Bit map of SOCKET Descriptors */ -} SlFdSet_t; - -typedef struct { - uint8_t rate; /* Recevied Rate */ - uint8_t channel; /* The received channel*/ - int8_t rssi; /* The computed RSSI value in db of current frame */ - uint8_t padding; /* pad to align to 32 bits */ - uint32_t timestamp; /* Timestamp in microseconds, */ -} SlTransceiverRxOverHead_t; - -class cc3100_nonos; - -class cc3100_socket -{ - -public: - - cc3100_socket(cc3100_driver &driver, cc3100_nonos &nonos); - - ~cc3100_socket(); - - /*******************************************************************************/ - /* Functions prototypes */ - /*******************************************************************************/ - void _sl_BuildAddress(const SlSockAddr_t *addr, int16_t addrlen, _SocketAddrCommand_u *pCmd); - void _sl_ParseAddress(_SocketAddrResponse_u *pRsp, SlSockAddr_t *addr, SlSocklen_t *addrlen); - uint16_t _sl_TruncatePayloadByProtocol(const int16_t pSd,const uint16_t length); - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - /*! - - \brief create an endpoint for communication - - The socket function creates a new socket of a certain socket type, identified - by an integer number, and allocates system resources to it. - This function is called by the application layer to obtain a socket handle. - - \param[in] domain specifies the protocol family of the created socket. - For example: - AF_INET for network protocol IPv4 - AF_RF for starting transceiver mode. Notes: - - sending and receiving any packet overriding 802.11 header - - for optimized power consumption the socket will be started in TX - only mode until receive command is activated - AF_INET6 for IPv6 - - - \param[in] type specifies the communication semantic, one of: - SOCK_STREAM (reliable stream-oriented service or Stream Sockets) - SOCK_DGRAM (datagram service or Datagram Sockets) - SOCK_RAW (raw protocols atop the network layer) - when used with AF_RF: - SOCK_DGRAM - L2 socket - SOCK_RAW - L1 socket - bypass WLAN CCA (Clear Channel Assessment) - - \param[in] protocol specifies a particular transport to be used with - the socket. - The most common are IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, - IPPROTO_DCCP. - The value 0 may be used to select a default - protocol from the selected domain and type - - - \return On success, socket handle that is used for consequent socket operations. - A successful return code should be a positive number (int16) - On error, a negative (int16) value will be returned specifying the error code. - SL_EAFNOSUPPORT - illegal domain parameter - SL_EPROTOTYPE - illegal type parameter - SL_EACCES - permission denied - SL_ENSOCK - exceeded maximal number of socket - SL_ENOMEM - memory allocation error - SL_EINVAL - error in socket configuration - SL_EPROTONOSUPPORT - illegal protocol parameter - SL_EOPNOTSUPP - illegal combination of protocol and type parameters - - - \sa sl_Close - \note belongs to \ref basic_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Socket) - int16_t sl_Socket(int16_t Domain, int16_t Type, int16_t Protocol); -#endif - - /*! - \brief gracefully close socket - - This function causes the system to release resources allocated to a socket. \n - In case of TCP, the connection is terminated. - - \param[in] sd socket handle (received in sl_Socket) - - \return On success, zero is returned. - On error, a negative number is returned. - - \sa sl_Socket - \note belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Close) - int16_t sl_Close(int16_t sd); -#endif - - /*! - \brief Accept a connection on a socket - - This function is used with connection-based socket types (SOCK_STREAM). - It extracts the first connection request on the queue of pending - connections, creates a new connected socket, and returns a new file - descriptor referring to that socket. - The newly created socket is not in the listening state. The - original socket sd is unaffected by this call. - The argument sd is a socket that has been created with - sl_Socket(), bound to a local address with sl_Bind(), and is - listening for connections after a sl_Listen(). The argument \b - \e addr is a pointer to a sockaddr structure. This structure - is filled in with the address of the peer socket, as known to - the communications layer. The exact format of the address - returned addr is determined by the socket's address family. - The \b \e addrlen argument is a value-result argument: it - should initially contain the size of the structure pointed to - by addr, on return it will contain the actual length (in - bytes) of the address returned. - - \param[in] sd socket descriptor (handle) - \param[out] addr the argument addr is a pointer - to a sockaddr structure. This - structure is filled in with the - address of the peer socket, as - known to the communications - layer. The exact format of the - address returned addr is - determined by the socket's - address\n - sockaddr:\n - code for the - address format. On this version - only AF_INET is supported.\n - - socket address, the length - depends on the code format - \param[out] addrlen the addrlen argument is a value-result - argument: it should initially contain the - size of the structure pointed to by addr - - \return On success, a socket handle. - On a non-blocking accept a possible negative value is SL_EAGAIN. - On failure, negative value. - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_Socket sl_Bind sl_Listen - \note belongs to \ref server_side - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Accept) - int16_t sl_Accept(int16_t sd, SlSockAddr_t *addr, SlSocklen_t *addrlen); -#endif - - /*! - \brief assign a name to a socket - - This function gives the socket the local address addr. - addr is addrlen bytes long. Traditionally, this is called - When a socket is created with socket, it exists in a name - space (address family) but has no name assigned. - It is necessary to assign a local address before a SOCK_STREAM - socket may receive connections. - - \param[in] sd socket descriptor (handle) - \param[in] addr specifies the destination - addrs\n sockaddr:\n - code for - the address format. On this - version only AF_INET is - supported.\n - socket address, - the length depends on the code - format - \param[in] addrlen contains the size of the structure pointed to by addr - - \return On success, zero is returned. On error, a negative error code is returned. - - \sa sl_Socket sl_Accept sl_Listen - \note belongs to \ref basic_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Bind) - int16_t sl_Bind(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen); -#endif - - /*! - \brief listen for connections on a socket - - The willingness to accept incoming connections and a queue - limit for incoming connections are specified with listen(), - and then the connections are accepted with accept. - The listen() call applies only to sockets of type SOCK_STREAM - The backlog parameter defines the maximum length the queue of - pending connections may grow to. - - \param[in] sd socket descriptor (handle) - \param[in] backlog specifies the listen queue depth. - - - \return On success, zero is returned. On error, a negative error code is returned. - - \sa sl_Socket sl_Accept sl_Bind - \note belongs to \ref server_side - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Listen) - int16_t sl_Listen(int16_t sd, int16_t backlog); -#endif - - /*! - \brief Initiate a connection on a socket - - Function connects the socket referred to by the socket - descriptor sd, to the address specified by addr. The addrlen - argument specifies the size of addr. The format of the - address in addr is determined by the address space of the - socket. If it is of type SOCK_DGRAM, this call specifies the - peer with which the socket is to be associated; this address - is that to which datagrams are to be sent, and the only - address from which datagrams are to be received. If the - socket is of type SOCK_STREAM, this call attempts to make a - connection to another socket. The other socket is specified - by address, which is an address in the communications space - of the socket. - - - \param[in] sd socket descriptor (handle) - \param[in] addr specifies the destination addr\n - sockaddr:\n - code for the - address format. On this version - only AF_INET is supported.\n - - socket address, the length - depends on the code format - - \param[in] addrlen contains the size of the structure pointed - to by addr - - \return On success, a socket handle. - On a non-blocking connect a possible negative value is SL_EALREADY. - On failure, negative value. - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_Socket - \note belongs to \ref client_side - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Connect) - int16_t sl_Connect(int16_t sd, const SlSockAddr_t *addr, int16_t addrlen); -#endif - - /*! - \brief Monitor socket activity - - Select allow a program to monitor multiple file descriptors, - waiting until one or more of the file descriptors become - "ready" for some class of I/O operation - - - \param[in] nfds the highest-numbered file descriptor in any of the - three sets, plus 1. - \param[out] readsds socket descriptors list for read monitoring and accept monitoring - \param[out] writesds socket descriptors list for connect monitoring only, write monitoring is not supported - \param[out] exceptsds socket descriptors list for exception monitoring, not supported. - \param[in] timeout is an upper bound on the amount of time elapsed - before select() returns. Null or above 0xffff seconds means - infinity timeout. The minimum timeout is 10 milliseconds, - less than 10 milliseconds will be set automatically to 10 milliseconds. - Max microseconds supported is 0xfffc00. - - \return On success, select() returns the number of - file descriptors contained in the three returned - descriptor sets (that is, the total number of bits that - are set in readfds, writefds, exceptfds) which may be - zero if the timeout expires before anything interesting - happens. On error, a negative value is returned. - readsds - return the sockets on which Read request will - return without delay with valid data. - writesds - return the sockets on which Write request - will return without delay. - exceptsds - return the sockets closed recently. - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_Socket - \note If the timeout value set to less than 5ms it will automatically set - to 5ms to prevent overload of the system - belongs to \ref basic_api - - Only one sl_Select can be handled at a time. - Calling this API while the same command is called from another thread, may result - in one of the two scenarios: - 1. The command will wait (internal) until the previous command finish, and then be executed. - 2. There are not enough resources and SL_POOL_IS_EMPTY error will return. - In this case, MAX_CONCURRENT_ACTIONS can be increased (result in memory increase) or try - again later to issue the command. - - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Select) - int16_t sl_Select(int16_t nfds, SlFdSet_t *readsds, SlFdSet_t *writesds, SlFdSet_t *exceptsds, SlTimeval_t *timeout); - - - /*! - \brief Select's SlFdSet_t SET function - - Sets current socket descriptor on SlFdSet_t container - */ - void SL_FD_SET(int16_t fd, SlFdSet_t *fdset); - - /*! - \brief Select's SlFdSet_t CLR function - - Clears current socket descriptor on SlFdSet_t container - */ - void SL_FD_CLR(int16_t fd, SlFdSet_t *fdset); - - - /*! - \brief Select's SlFdSet_t ISSET function - - Checks if current socket descriptor is set (TRUE/FALSE) - - \return Returns TRUE if set, FALSE if unset - - */ - int16_t SL_FD_ISSET(int16_t fd, SlFdSet_t *fdset); - - /*! - \brief Select's SlFdSet_t ZERO function - - Clears all socket descriptors from SlFdSet_t - */ - void SL_FD_ZERO(SlFdSet_t *fdset); - - - -#endif - - /*! - \brief set socket options - - This function manipulate the options associated with a socket. - Options may exist at multiple protocol levels; they are always - present at the uppermost socket level. - - When manipulating socket options the level at which the option resides - and the name of the option must be specified. To manipulate options at - the socket level, level is specified as SOL_SOCKET. To manipulate - options at any other level the protocol number of the appropriate proto- - col controlling the option is supplied. For example, to indicate that an - option is to be interpreted by the TCP protocol, level should be set to - the protocol number of TCP; - - The parameters optval and optlen are used to access optval - - ues for setsockopt(). For getsockopt() they identify a - buffer in which the value for the requested option(s) are to - be returned. For getsockopt(), optlen is a value-result - parameter, initially containing the size of the buffer - pointed to by option_value, and modified on return to - indicate the actual size of the value returned. If no option - value is to be supplied or returned, option_value may be - NULL. - - \param[in] sd socket handle - \param[in] level defines the protocol level for this option - - <b>SL_SOL_SOCKET</b> Socket level configurations (L4, transport layer) - - <b>SL_IPPROTO_IP</b> IP level configurations (L3, network layer) - - <b>SL_SOL_PHY_OPT</b> Link level configurations (L2, link layer) - \param[in] optname defines the option name to interrogate - - <b>SL_SOL_SOCKET</b> - - <b>SL_SO_KEEPALIVE</b> \n - Enable/Disable periodic keep alive. - Keeps TCP connections active by enabling the periodic transmission of messages \n - Timeout is 5 minutes.\n - Default: Enabled \n - This options takes SlSockKeepalive_t struct as parameter - - <b>SL_SO_RCVTIMEO</b> \n - Sets the timeout value that specifies the maximum amount of time an input function waits until it completes. \n - Default: No timeout \n - This options takes SlTimeval_t struct as parameter - - <b>SL_SO_RCVBUF</b> \n - Sets tcp max recv window size. \n - This options takes SlSockWinsize_t struct as parameter - - <b>SL_SO_NONBLOCKING</b> \n - Sets socket to non-blocking operation Impacts: connect, accept, send, sendto, recv and recvfrom. \n - Default: Blocking. - This options takes SlSockNonblocking_t struct as parameter - - <b>SL_SO_SECMETHOD</b> \n - Sets method to tcp secured socket (SL_SEC_SOCKET) \n - Default: SL_SO_SEC_METHOD_SSLv3_TLSV1_2 \n - This options takes SlSockSecureMethod struct as parameter - - <b>SL_SO_SEC_MASK</b> \n - Sets specific cipher to tcp secured socket (SL_SEC_SOCKET) \n - Default: "Best" cipher suitable to method \n - This options takes SlSockSecureMask struct as parameter - - <b>SL_SO_SECURE_FILES_CA_FILE_NAME</b> \n - Map secured socket to CA file by name \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME</b> \n - Map secured socket to private key by name \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME</b> \n - Map secured socket to certificate file by name \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_SO_SECURE_FILES_DH_KEY_FILE_NAME</b> \n - Map secured socket to Diffie Hellman file by name \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_SO_CHANGE_CHANNEL</b> \n - Sets channel in transceiver mode. - This options takes <b>uint32_t</b> as channel number parameter - - <b>SL_IPPROTO_IP</b> - - <b>SL_IP_MULTICAST_TTL</b> \n - Set the time-to-live value of outgoing multicast packets for this socket. \n - This options takes <b>uint8_t</b> as parameter - - <b>SL_IP_ADD_MEMBERSHIP</b> \n - UDP socket, Join a multicast group. \n - This options takes SlSockIpMreq struct as parameter - - <b>SL_IP_DROP_MEMBERSHIP</b> \n - UDP socket, Leave a multicast group \n - This options takes SlSockIpMreq struct as parameter - - <b>SL_IP_RAW_RX_NO_HEADER</b> \n - Raw socket remove IP header from received data. \n - Default: data includes ip header \n - This options takes <b>uint32_t</b> as parameter - - <b>SL_IP_HDRINCL</b> \n - RAW socket only, the IPv4 layer generates an IP header when sending a packet unless \n - the IP_HDRINCL socket option is enabled on the socket. \n - When it is enabled, the packet must contain an IP header. \n - Default: disabled, IPv4 header generated by Network Stack \n - This options takes <b>uint32_t</b> as parameter - - <b>SL_IP_RAW_IPV6_HDRINCL</b> (inactive) \n - RAW socket only, the IPv6 layer generates an IP header when sending a packet unless \n - the IP_HDRINCL socket option is enabled on the socket. When it is enabled, the packet must contain an IP header \n - Default: disabled, IPv4 header generated by Network Stack \n - This options takes <b>uint32_t</b> as parameter - - <b>SL_SOL_PHY_OPT</b> - - <b>SL_SO_PHY_RATE</b> \n - RAW socket, set WLAN PHY transmit rate \n - The values are based on RateIndex_e \n - This options takes <b>uint32_t</b> as parameter - - <b>SL_SO_PHY_TX_POWER</b> \n - RAW socket, set WLAN PHY TX power \n - Valid rage is 1-15 \n - This options takes <b>uint32_t</b> as parameter - - <b>SL_SO_PHY_NUM_FRAMES_TO_TX</b> \n - RAW socket, set number of frames to transmit in transceiver mode. - Default: 1 packet - This options takes <b>uint32_t</b> as parameter - - <b>SL_SO_PHY_PREAMBLE</b> \n - RAW socket, set WLAN PHY preamble for Long/Short\n - This options takes <b>uint32_t</b> as parameter - - \param[in] optval specifies a value for the option - \param[in] optlen specifies the length of the - option value - - \return On success, zero is returned. - On error, a negative value is returned. - \sa sl_getsockopt - \note belongs to \ref basic_api - \warning - \par Examples: - \par - <b> SL_SO_KEEPALIVE: </b>(disable Keepalive) - \code - SlSockKeepalive_t enableOption; - enableOption.KeepaliveEnabled = 0; - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_KEEPALIVE, (uint8_t *)&enableOption,sizeof(enableOption)); - \endcode - \par - <b> SL_SO_RCVTIMEO: </b> - \code - struct SlTimeval_t timeVal; - timeVal.tv_sec = 1; // Seconds - timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVTIMEO, (uint8_t *)&timeVal, sizeof(timeVal)); // Enable receive timeout - \endcode - \par - <b> SL_SO_RCVBUF: </b> - \code - SlSockWinsize_t size; - size.Winsize = 3000; // bytes - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVBUF, (uint8_t *)&size, sizeof(size)); - \endcode - \par - <b> SL_SO_NONBLOCKING: </b> - \code - SlSockNonblocking_t enableOption; - enableOption.NonblockingEnabled = 1; - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (uint8_t *)&enableOption,sizeof(enableOption)); // Enable/disable nonblocking mode - \endcode - \par - <b> SL_SO_SECMETHOD:</b> - \code - SlSockSecureMethod method; - method.secureMethod = SL_SO_SEC_METHOD_SSLV3; // security method we want to use - SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET); - sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SECMETHOD, (uint8_t *)&method, sizeof(method)); - \endcode - \par - <b> SL_SO_SECURE_MASK:</b> - \code - SlSockSecureMask cipher; - cipher.secureMask = SL_SEC_MASK_SSL_RSA_WITH_RC4_128_SHA; // cipher type - SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET); - sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_SEC_MASK,(uint8_t *)&cipher, sizeof(cipher)); - \endcode - \par - <b> SL_SO_SECURE_FILES_CA_FILE_NAME:</b> - \code - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CA_FILE_NAME,"exuifaxCaCert.der",strlen("exuifaxCaCert.der")); - \endcode - - \par - <b> SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME:</b> - \code - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,"myPrivateKey.der",strlen("myPrivateKey.der")); - \endcode - - \par - <b> SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME:</b> - \code - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,"myCertificate.der",strlen("myCertificate.der")); - \endcode - - \par - <b> SL_SO_SECURE_FILES_DH_KEY_FILE_NAME:</b> - \code - sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_DH_KEY_FILE_NAME,"myDHinServerMode.der",strlen("myDHinServerMode.der")); - \endcode - - \par - <b> SL_IP_MULTICAST_TTL:</b> - \code - uint8_t ttl = 20; - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_MULTICAST_TTL, &ttl, sizeof(ttl)); - \endcode - - \par - <b> SL_IP_ADD_MEMBERSHIP:</b> - \code - SlSockIpMreq mreq; - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); - \endcode - - \par - <b> SL_IP_DROP_MEMBERSHIP:</b> - \code - SlSockIpMreq mreq; - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); - \endcode - - \par - <b> SL_SO_CHANGE_CHANNEL:</b> - \code - uint32_t newChannel = 6; // range is 1-13 - sl_SetSockOpt(SockID, SL_SOL_SOCKET, SL_SO_CHANGE_CHANNEL, &newChannel, sizeof(newChannel)); - \endcode - - \par - <b> SL_IP_RAW_RX_NO_HEADER:</b> - \code - uint32_t header = 1; // remove ip header - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_RX_NO_HEADER, &header, sizeof(header)); - \endcode - - \par - <b> SL_IP_HDRINCL:</b> - \code - uint32_t header = 1; - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_HDRINCL, &header, sizeof(header)); - \endcode - \par - <b> SL_IP_RAW_IPV6_HDRINCL:</b> - \code - uint32_t header = 1; - sl_SetSockOpt(SockID, SL_IPPROTO_IP, SL_IP_RAW_IPV6_HDRINCL, &header, sizeof(header)); - \endcode - - \par - <b> SL_SO_PHY_RATE:</b> - \code - uint32_t rate = 6; // see wlan.h RateIndex_e for values - sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate)); - \endcode - - \par - <b> SL_SO_PHY_TX_POWER:</b> - \code - uint32_t txpower = 1; // valid range is 1-15 - sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &txpower, sizeof(txpower)); - \endcode - - \par - <b> SL_SO_PHY_NUM_FRAMES_TO_TX:</b> - \code - uint32_t numframes = 1; - sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_NUM_FRAMES_TO_TX, &numframes, sizeof(numframes)); - \endcode - - \par - <b> SL_SO_PHY_PREAMBLE:</b> - \code - uint32_t preamble = 1; - sl_SetSockOpt(SockID, SL_SOL_PHY_OPT, SL_SO_PHY_PREAMBLE, &preamble, sizeof(preamble)); - \endcode - - */ -#if _SL_INCLUDE_FUNC(sl_SetSockOpt) - int16_t sl_SetSockOpt(int16_t sd, int16_t level, int16_t optname, const void *optval, SlSocklen_t optlen); -#endif - - /*! - \brief Get socket options - - This function manipulate the options associated with a socket. - Options may exist at multiple protocol levels; they are always - present at the uppermost socket level. - - When manipulating socket options the level at which the option resides - and the name of the option must be specified. To manipulate options at - the socket level, level is specified as SOL_SOCKET. To manipulate - options at any other level the protocol number of the appropriate proto- - col controlling the option is supplied. For example, to indicate that an - option is to be interpreted by the TCP protocol, level should be set to - the protocol number of TCP; - - The parameters optval and optlen are used to access optval - - ues for setsockopt(). For getsockopt() they identify a - buffer in which the value for the requested option(s) are to - be returned. For getsockopt(), optlen is a value-result - parameter, initially containing the size of the buffer - pointed to by option_value, and modified on return to - indicate the actual size of the value returned. If no option - value is to be supplied or returned, option_value may be - NULL. - - - \param[in] sd socket handle - \param[in] level defines the protocol level for this option - \param[in] optname defines the option name to interrogate - \param[out] optval specifies a value for the option - \param[out] optlen specifies the length of the - option value - - \return On success, zero is returned. - On error, a negative value is returned. - \sa sl_SetSockOpt - \note See sl_SetSockOpt - belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_GetSockOpt) - int16_t sl_GetSockOpt(int16_t sd, int16_t level, int16_t optname, void *optval, SlSocklen_t *optlen); -#endif - - /*! - \brief read data from TCP socket - - function receives a message from a connection-mode socket - - \param[in] sd socket handle - \param[out] buf Points to the buffer where the - message should be stored. - \param[in] Len Specifies the length in bytes of - the buffer pointed to by the buffer argument. - Range: 1-16000 bytes - \param[in] flags Specifies the type of message - reception. On this version, this parameter is not - supported. - - \return return the number of bytes received, - or a negative value if an error occurred. - using a non-blocking recv a possible negative value is SL_EAGAIN. - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_RecvFrom - \note belongs to \ref recv_api - \warning - \par Examples: - \code An example of receiving data using TCP socket: - - SlSockAddrIn_t Addr; - SlSockAddrIn_t LocalAddr; - int16_t AddrSize = sizeof(SlSockAddrIn_t); - int16_t SockID, newSockID; - int16_t Status; - int8_t Buf[RECV_BUF_LEN]; - - LocalAddr.sin_family = SL_AF_INET; - LocalAddr.sin_port = sl_Htons(5001); - LocalAddr.sin_addr.s_addr = 0; - - Addr.sin_family = SL_AF_INET; - Addr.sin_port = sl_Htons(5001); - Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); - - SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); - Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize); - Status = sl_Listen(SockID, 0); - newSockID = sl_Accept(SockID, (SlSockAddr_t*)&Addr, (SlSocklen_t*) &AddrSize); - Status = sl_Recv(newSockID, Buf, 1460, 0); - \endcode - \code Example code for Rx transceiver mode using a raw socket - int8_t buffer[1536]; - int16_t sd; - uint16_t size; - SlTransceiverRxOverHead_t *transHeader; - sd = sl_Socket(SL_AF_RF,SL_SOCK_RAW,11); // channel 11 - while(1) - { - size = sl_Recv(sd,buffer,1536,0); - transHeader = (SlTransceiverRxOverHead_t *)buffer; - printf("RSSI is %d frame type is 0x%x size %d\n",transHeader->rssi,buffer[sizeof(SlTransceiverRxOverHead_t)],size); - } - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_Recv) - int16_t sl_Recv(int16_t sd, void *buf, int16_t Len, int16_t flags); -#endif - - /*! - \brief read data from socket - - function receives a message from a connection-mode or - connectionless-mode socket - - \param[in] sd socket handle - \param[out] buf Points to the buffer where the message should be stored. - \param[in] Len Specifies the length in bytes of the buffer pointed to by the buffer argument. - Range: 1-16000 bytes - \param[in] flags Specifies the type of message - reception. On this version, this parameter is not - supported. - \param[in] from pointer to an address structure - indicating the source - address.\n sockaddr:\n - code - for the address format. On this - version only AF_INET is - supported.\n - socket address, - the length depends on the code - format - \param[in] fromlen source address structure - size. This parameter MUST be set to the size of the structure pointed to by addr. - - - \return return the number of bytes received, - or a negative value if an error occurred. - using a non-blocking recv a possible negative value is SL_EAGAIN. - SL_RET_CODE_INVALID_INPUT (-2) will be returned if fromlen has incorrect length. - SL_POOL_IS_EMPTY may be return in case there are no resources in the system - In this case try again later or increase MAX_CONCURRENT_ACTIONS - - \sa sl_Recv - \note belongs to \ref recv_api - \warning - \par Example: - \code An example of receiving data: - - SlSockAddrIn_t Addr; - SlSockAddrIn_t LocalAddr; - int16_t AddrSize = sizeof(SlSockAddrIn_t); - int16_t SockID; - int16_t Status; - int8_t Buf[RECV_BUF_LEN]; - - LocalAddr.sin_family = SL_AF_INET; - LocalAddr.sin_port = sl_Htons(5001); - LocalAddr.sin_addr.s_addr = 0; - - SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0); - Status = sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize); - Status = sl_RecvFrom(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, (SlSocklen_t*)&AddrSize); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_RecvFrom) - int16_t sl_RecvFrom(int16_t sd, void *buf, int16_t Len, int16_t flags, SlSockAddr_t *from, SlSocklen_t *fromlen); -#endif - - /*! - \brief write data to TCP socket - - This function is used to transmit a message to another socket. - Returns immediately after sending data to device. - In case of TCP failure an async event SL_SOCKET_TX_FAILED_EVENT is going to - be received. - In case of a RAW socket (transceiver mode), extra 4 bytes should be reserved at the end of the - frame data buffer for WLAN FCS - - \param[in] sd socket handle - \param[in] buf Points to a buffer containing - the message to be sent - \param[in] Len message size in bytes. Range: 1-1460 bytes - \param[in] flags Specifies the type of message - transmission. On this version, this parameter is not - supported for TCP. - For transceiver mode, the SL_RAW_RF_TX_PARAMS macro can be used to determine - transmission parameters (channel,rate,tx_power,preamble) - - - \return Return the number of bytes transmitted, - or -1 if an error occurred - - \sa sl_SendTo - \note belongs to \ref send_api - \warning - \par Example: - \code An example of sending data: - - SlSockAddrIn_t Addr; - int16_t AddrSize = sizeof(SlSockAddrIn_t); - int16_t SockID; - int16_t Status; - int8_t Buf[SEND_BUF_LEN]; - - Addr.sin_family = SL_AF_INET; - Addr.sin_port = sl_Htons(5001); - Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); - - SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); - Status = sl_Connect(SockID, (SlSockAddr_t *)&Addr, AddrSize); - Status = sl_Send(SockID, Buf, 1460, 0 ); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_Send ) - int16_t sl_Send(int16_t sd, const void *buf, int16_t Len, int16_t flags); -#endif - - /*! - \brief write data to socket - - This function is used to transmit a message to another socket - (connection less socket SOCK_DGRAM, SOCK_RAW). - Returns immediately after sending data to device. - In case of transmission failure an async event SL_SOCKET_TX_FAILED_EVENT is going to - be received. - - \param[in] sd socket handle - \param[in] buf Points to a buffer containing - the message to be sent - \param[in] Len message size in bytes. Range: 1-1460 bytes - \param[in] flags Specifies the type of message - transmission. On this version, this parameter is not - supported - \param[in] to pointer to an address structure - indicating the destination - address.\n sockaddr:\n - code - for the address format. On this - version only AF_INET is - supported.\n - socket address, - the length depends on the code - format - \param[in] tolen destination address structure size - - \return Return the number of transmitted bytes, - or -1 if an error occurred - - \sa sl_Send - \note belongs to \ref send_api - \warning - \par Example: - \code An example of sending data: - - SlSockAddrIn_t Addr; - int16_t AddrSize = sizeof(SlSockAddrIn_t); - int16_t SockID; - int16_t Status; - int8_t Buf[SEND_BUF_LEN]; - - Addr.sin_family = SL_AF_INET; - Addr.sin_port = sl_Htons(5001); - Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200)); - - SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0); - Status = sl_SendTo(SockID, Buf, 1472, 0, (SlSockAddr_t *)&Addr, AddrSize); - - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_SendTo) - int16_t sl_SendTo(int16_t sd, const void *buf, int16_t Len, int16_t flags, const SlSockAddr_t *to, SlSocklen_t tolen); -#endif - - /*! - \brief Reorder the bytes of a 32-bit unsigned value - - This function is used to Reorder the bytes of a 32-bit unsigned value from processor order to network order. - - \param[in] var variable to reorder - - \return Return the reorder variable, - - \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept - \note belongs to \ref send_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Htonl ) - uint32_t sl_Htonl( uint32_t val ); - -#define sl_Ntohl sl_Htonl /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */ -#endif - - /*! - \brief Reorder the bytes of a 16-bit unsigned value - - This function is used to Reorder the bytes of a 16-bit unsigned value from processor order to network order. - - \param[in] var variable to reorder - - \return Return the reorder variable, - - \sa sl_SendTo sl_Bind sl_Connect sl_RecvFrom sl_Accept - \note belongs to \ref send_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_Htons ) - uint16_t sl_Htons( uint16_t val ); - -#define sl_Ntohs sl_Htons /* Reorder the bytes of a 16-bit unsigned value from network order to processor orde. */ -#endif - -private: - - cc3100_driver &_driver; - cc3100_nonos &_nonos; - -};//class - - -}//namespace mbed_cc3100 - - /*! - - Close the Doxygen group. - @} - - */ - -#endif /* __SOCKET_H__ */ - - -
--- a/simplelink/cc3100_spawn.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -/* - * spawn.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_spawn.h" - -namespace mbed_cc3100 { - -#if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) - -#define _SL_MAX_INTERNAL_SPAWN_ENTRIES 10 - - -typedef struct _SlInternalSpawnEntry_t { - _SlSpawnEntryFunc_t pEntry; - void* pValue; - struct _SlInternalSpawnEntry_t* pNext; -} _SlInternalSpawnEntry_t; - -typedef struct { - _SlInternalSpawnEntry_t SpawnEntries[_SL_MAX_INTERNAL_SPAWN_ENTRIES]; - _SlInternalSpawnEntry_t* pFree; - _SlInternalSpawnEntry_t* pWaitForExe; - _SlInternalSpawnEntry_t* pLastInWaitList; - _SlSyncObj_t SyncObj; - _SlLockObj_t LockObj; -} _SlInternalSpawnCB_t; - -_SlInternalSpawnCB_t g_SlInternalSpawnCB; - -cc3100_spawn::cc3100_spawn() -{ - -} - -cc3100_spawn::~cc3100_spawn() -{ - -} - - -void cc3100_spawn::_SlInternalSpawnTaskEntry() -{ - int16_t i; - _SlInternalSpawnEntry_t* pEntry; - uint8_t LastEntry; - - /* create and lock the locking object. lock in order to avoid race condition - on the first creation */ - sl_LockObjCreate(&g_SlInternalSpawnCB.LockObj,"SlSpawnProtect"); - sl_LockObjLock(&g_SlInternalSpawnCB.LockObj,SL_OS_NO_WAIT); - - /* create and clear the sync object */ - sl_SyncObjCreate(&g_SlInternalSpawnCB.SyncObj,"SlSpawnSync"); - sl_SyncObjWait(&g_SlInternalSpawnCB.SyncObj,SL_OS_NO_WAIT); - - g_SlInternalSpawnCB.pFree = &g_SlInternalSpawnCB.SpawnEntries[0]; - g_SlInternalSpawnCB.pWaitForExe = NULL; - g_SlInternalSpawnCB.pLastInWaitList = NULL; - - /* create the link list between the entries */ - for (i=0 ; i<_SL_MAX_INTERNAL_SPAWN_ENTRIES - 1 ; i++) { - g_SlInternalSpawnCB.SpawnEntries[i].pNext = &g_SlInternalSpawnCB.SpawnEntries[i+1]; - g_SlInternalSpawnCB.SpawnEntries[i].pEntry = NULL; - } - g_SlInternalSpawnCB.SpawnEntries[i].pNext = NULL; - - sl_LockObjUnlock(&g_SlInternalSpawnCB.LockObj); - - - /* here we ready to execute entries */ - - while (TRUE) { - sl_SyncObjWait(&g_SlInternalSpawnCB.SyncObj,SL_OS_WAIT_FOREVER); - /* go over all entries that already waiting for execution */ - LastEntry = FALSE; - do { - /* get entry to execute */ - sl_LockObjLock(&g_SlInternalSpawnCB.LockObj,SL_OS_WAIT_FOREVER); - - pEntry = g_SlInternalSpawnCB.pWaitForExe; - if ( NULL == pEntry ) { - sl_LockObjUnlock(&g_SlInternalSpawnCB.LockObj); - break; - } - g_SlInternalSpawnCB.pWaitForExe = pEntry->pNext; - if (pEntry == g_SlInternalSpawnCB.pLastInWaitList) { - g_SlInternalSpawnCB.pLastInWaitList = NULL; - LastEntry = TRUE; - } - - sl_LockObjUnlock(&g_SlInternalSpawnCB.LockObj); - - - /* pEntry could be null in case that the sync was already set by some - of the entries during execution of earlier entry */ - if (NULL != pEntry) { - pEntry->pEntry(pEntry->pValue); - /* free the entry */ - sl_LockObjLock(&g_SlInternalSpawnCB.LockObj,SL_OS_WAIT_FOREVER); - - pEntry->pNext = g_SlInternalSpawnCB.pFree; - g_SlInternalSpawnCB.pFree = pEntry; - - - if (NULL != g_SlInternalSpawnCB.pWaitForExe) { - /* new entry received meanwhile */ - LastEntry = FALSE; - } - - sl_LockObjUnlock(&g_SlInternalSpawnCB.LockObj); - - } - - } while (!LastEntry); - } -} - - -int16_t cc3100_spawn::_SlInternalSpawn(_SlSpawnEntryFunc_t pEntry , void* pValue , uint32_t flags) -{ - int16_t Res = 0; - _SlInternalSpawnEntry_t* pSpawnEntry; - - if (NULL == pEntry) { - Res = -1; - } else { - sl_LockObjLock(&g_SlInternalSpawnCB.LockObj,SL_OS_WAIT_FOREVER); - - pSpawnEntry = g_SlInternalSpawnCB.pFree; - g_SlInternalSpawnCB.pFree = pSpawnEntry->pNext; - - pSpawnEntry->pEntry = pEntry; - pSpawnEntry->pValue = pValue; - pSpawnEntry->pNext = NULL; - - if (NULL == g_SlInternalSpawnCB.pWaitForExe) { - g_SlInternalSpawnCB.pWaitForExe = pSpawnEntry; - g_SlInternalSpawnCB.pLastInWaitList = pSpawnEntry; - } else { - g_SlInternalSpawnCB.pLastInWaitList->pNext = pSpawnEntry; - g_SlInternalSpawnCB.pLastInWaitList = pSpawnEntry; - } - - sl_LockObjUnlock(&g_SlInternalSpawnCB.LockObj); - /* this sync is called after releasing the lock object to avoid unnecessary context switches */ - sl_SyncObjSignal(&g_SlInternalSpawnCB.SyncObj); - } - - return Res; -} - -#endif - -}//namespace mbed_cc3100
--- a/simplelink/cc3100_spawn.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - * spawn.h - 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. - * -*/ - -#ifndef SPAWN_H_ -#define SPAWN_H_ - - -namespace mbed_cc3100 { - -class cc3100_spawn -{ - -public: - - cc3100_spawn() { - - } - - ~cc3100_spawn() { - - } - -#if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) - - void _SlInternalSpawnTaskEntry(); - int16_t _SlInternalSpawn(_SlSpawnEntryFunc_t pEntry , void* pValue , uint32_t flags); - -#undef sl_Spawn -#define sl_Spawn(pEntry,pValue,flags) _SlInternalSpawn(pEntry,pValue,flags) - -#undef _SlTaskEntry -#define _SlTaskEntry _SlInternalSpawnTaskEntry - - -#endif - -};//class - -}//namespace mbed_cc3100 - -#endif -
--- a/simplelink/cc3100_spi.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -/* - * spi.cpp mbed - * - * 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 "cc3100_simplelink.h" -#include "cc3100_spi.h" - - -namespace mbed_cc3100 { - -P_EVENT_HANDLER pIraEventHandler = 0; -uint8_t IntIsMasked; - -cc3100_spi::cc3100_spi(PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi, cc3100_driver &driver) - : _wlan_irq(cc3100_irq), _wlan_nHIB(cc3100_nHIB), _wlan_cs(cc3100_cs), _wlan_spi(cc3100_spi), _driver(driver) -{ - - _wlan_spi.format(8,1); - _wlan_spi.frequency(16000000); - _wlan_irq.rise(this, &cc3100_spi::IntSpiGPIOHandler); //_SlDrvRxIrqHandler is triggered after IntSpiGPIOHandler - _wlan_nHIB = 0; - _wlan_cs = 1; - wait_ms(200); - - -} - -cc3100_spi::~cc3100_spi() -{ - -} - -int cc3100_spi::spi_Close(Fd_t fd) -{ - // Disable WLAN Interrupt ... - cc3100_InterruptDisable(); - - return NONOS_RET_OK; -} - -void cc3100_spi::cc3100_InterruptEnable() -{ - __enable_irq(); -} - -void cc3100_spi::cc3100_InterruptDisable() -{ - __disable_irq(); -} - -void cc3100_spi::CC3100_disable() -{ - _wlan_nHIB = 0; -} - -void cc3100_spi::CC3100_enable() -{ - - _wlan_nHIB = 1; -} - -Fd_t cc3100_spi::spi_Open(int8_t *ifName, uint32_t flags) -{ - - // 50 ms delay - wait_ms(50); - - // Enable WLAN interrupt - cc3100_InterruptEnable(); - - return NONOS_RET_OK; -} - -int cc3100_spi::spi_Write(Fd_t fd, uint8_t *pBuff, int len) -{ - - int len_to_return = len; - - _wlan_cs = 0; - - while(len) { - _wlan_spi.write(*pBuff++); - len--; - } - - _wlan_cs = 1; - - return len_to_return; -} - -int cc3100_spi::spi_Read(Fd_t fd, uint8_t *pBuff, int len) -{ - int i = 0; - - _wlan_cs = 0; - - for (i = 0; i < len; i++) { - pBuff[i] = _wlan_spi.write(0xFF); - } - - _wlan_cs = 1; - - return len; -} - -void cc3100_spi::IntSpiGPIOHandler(void) -{ - - if(_wlan_irq){ - _driver._SlDrvRxIrqHandler(0); - } -} - -/*! - \brief register an interrupt handler for the host IRQ - - \param[in] InterruptHdl - pointer to interrupt handler function - - \param[in] pValue - pointer to a memory strcuture that is - passed to the interrupt handler. - - \return upon successful registration, the function shall return 0. - Otherwise, -1 shall be returned - - \sa - \note If there is already registered interrupt handler, the - function should overwrite the old handler with the new one - \warning -*/ -int cc3100_spi::registerInterruptHandler(P_EVENT_HANDLER InterruptHdl , void* pValue) -{ - - pIraEventHandler = InterruptHdl; - return 0; -} - -/*! - \brief Unmasks the Host IRQ - - \param[in] none - - \return none - - \warning -*/ -void cc3100_spi::UnMaskIntHdlr() -{ - IntIsMasked = FALSE; -} - -/*! - \brief Masks the Host IRQ - - \param[in] none - - \return none - - \warning -*/ -void cc3100_spi::MaskIntHdlr() -{ - IntIsMasked = TRUE; -} - -}//namespace mbed_cc3100 - - - - -
--- a/simplelink/cc3100_spi.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -/* - * spi.h - mbed - * - * 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. - * -*/ - - -#ifndef SPI_H_ -#define SPI_H_ - -#include "mbed.h" - - -/*! - \brief type definition for the spi channel file descriptor - - \note On each porting or platform the type could be whatever is needed - - integer, pointer to structure etc. -*/ -typedef unsigned int Fd_t; - -typedef void (*P_EVENT_HANDLER)(void* pValue); - -namespace mbed_cc3100 { - -class cc3100_driver; - -class cc3100_spi -{ -public: - - cc3100_spi(PinName cc3100_irq, PinName cc3100_nHIB, PinName cc3100_cs, SPI cc3100_spi, cc3100_driver &driver); - - ~cc3100_spi(); - - - /*! - \brief Enables the CC3100 - - \param[in] none - - \return none - - \note - - \warning - */ - void CC3100_enable(); - - /*! - \brief Disables the CC3100 - - \param[in] none - - \return none - - \note - - \warning - */ - void CC3100_disable(); - - /*! - \brief Enables the interrupt from the CC3100 - - \param[in] none - - \return none - - \note - - \warning - */ - void cc3100_InterruptEnable(); - - /*! - \brief Disables the interrupt from the CC3100 - - \param[in] none - - \return none - - \note - - \warning - */ - void cc3100_InterruptDisable(); - - /*! - \brief open spi communication port to be used for communicating with a - SimpleLink device - - Given an interface name and option flags, this function opens the spi - communication port and creates a file descriptor. This file descriptor can - be used afterwards to read and write data from and to this specific spi - channel. - The SPI speed, clock polarity, clock phase, chip select and all other - attributes are all set to hardcoded values in this function. - - \param[in] ifName - points to the interface name/path. The - interface name is an optional attributes that the simple - link driver receives on opening the device. in systems that - the spi channel is not implemented as part of the os device - drivers, this parameter could be NULL. - \param[in] flags - option flags - - \return upon successful completion, the function shall open the spi - channel and return a non-negative integer representing the - file descriptor. Otherwise, -1 shall be returned - - \sa spi_Close , spi_Read , spi_Write - \note - \warning - */ - - Fd_t spi_Open(int8_t *ifName, uint32_t flags); - - /*! - \brief closes an opened spi communication port - - \param[in] fd - file descriptor of an opened SPI channel - - \return upon successful completion, the function shall return 0. - Otherwise, -1 shall be returned - - \sa spi_Open - \note - \warning - */ - int spi_Close(Fd_t fd); - - /*! - \brief attempts to read up to len bytes from SPI channel into a buffer - starting at pBuff. - - \param[in] fd - file descriptor of an opened SPI channel - - \param[in] pBuff - points to first location to start writing the - data - - \param[in] len - number of bytes to read from the SPI channel - - \return upon successful completion, the function shall return 0. - Otherwise, -1 shall be returned - - \sa spi_Open , spi_Write - \note - \warning - */ - int spi_Read(Fd_t fd, uint8_t *pBuff, int len); - - /*! - \brief attempts to write up to len bytes to the SPI channel - - \param[in] fd - file descriptor of an opened SPI channel - - \param[in] pBuff - points to first location to start getting the - data from - - \param[in] len - number of bytes to write to the SPI channel - - \return upon successful completion, the function shall return 0. - Otherwise, -1 shall be returned - - \sa spi_Open , spi_Read - \note This function could be implemented as zero copy and return - only upon successful completion of writing the whole buffer, - but in cases that memory allocation is not too tight, the - function could copy the data to internal buffer, return - back and complete the write in parallel to other activities - as long as the other SPI activities would be blocked untill - the entire buffer write would be completed - \warning - */ - int spi_Write(Fd_t fd, uint8_t *pBuff, int len); - - /*! - \brief The IntSpiGPIOHandler interrupt handler - - \param[in] none - - \return none - - \note - - \warning - */ - void IntSpiGPIOHandler(void); - - /*! - \brief register an interrupt handler for the host IRQ - - \param[in] InterruptHdl - pointer to interrupt handler function - - \param[in] pValue - pointer to a memory strcuture that is - passed to the interrupt handler. - - \return upon successful registration, the function shall return 0. - Otherwise, -1 shall be returned - - \sa - \note If there is already registered interrupt handler, the - function should overwrite the old handler with the new one - \warning - */ - int registerInterruptHandler(P_EVENT_HANDLER InterruptHdl , void* pValue); - - /*! - \brief Masks the Host IRQ - - \param[in] none - - \return none - - \warning - */ - void MaskIntHdlr(); - - /*! - \brief Unmasks the Host IRQ - - \param[in] none - - \return none - - \warning - */ - void UnMaskIntHdlr(); - - -private: - - InterruptIn _wlan_irq; - DigitalOut _wlan_nHIB; - DigitalOut _wlan_cs; - SPI _wlan_spi; - cc3100_driver &_driver; - - -};//class -}//namespace mbed_cc3100 -#endif -
--- a/simplelink/cc3100_trace.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,183 +0,0 @@ -/* - * trace.h - 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. - * -*/ -#ifndef SIMPLELINK_TRACE_H_ -#define SIMPLELINK_TRACE_H_ - - -#include "cc3100_simplelink.h" - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/* This macro is for use by other macros to form a fully valid C statement. */ -#define st(x) do { x } while (__LINE__ == -1) - -#define SL_SYNC_SCAN_THRESHOLD (( uint32_t )2000) - -#define _SlDrvAssert(line ) { while(1); } - -#define _SL_ASSERT(expr) { if(!(expr)){_SlDrvAssert(__LINE__); } } -#define _SL_ERROR(expr, error) { if(!(expr)){return (error); } } - -#define SL_HANDLING_ASSERT 2 -#define SL_HANDLING_ERROR 1 -#define SL_HANDLING_NONE 0 - -#define SL_SELF_COND_HANDLING SL_HANDLING_ASSERT -#define SL_PROTOCOL_HANDLING SL_HANDLING_ASSERT -#define SL_DRV_RET_CODE_HANDLING SL_HANDLING_ASSERT -#define SL_NWP_IF_HANDLING SL_HANDLING_ASSERT -#define SL_OSI_RET_OK_HANDLING SL_HANDLING_ASSERT -#define SL_MALLOC_OK_HANDLING SL_HANDLING_ASSERT -#define SL_USER_ARGS_HANDLING SL_HANDLING_ASSERT - -#if (SL_DRV_RET_CODE_HANDLING == SL_HANDLING_ASSERT) -#define VERIFY_RET_OK(Func) {_SlReturnVal_t _RetVal = (Func); _SL_ASSERT((_SlReturnVal_t)SL_OS_RET_CODE_OK == _RetVal)} -#elif (SL_DRV_RET_CODE_HANDLING == SL_HANDLING_ERROR) -#define VERIFY_RET_OK(Func) {_SlReturnVal_t _RetVal = (Func); if (SL_OS_RET_CODE_OK != _RetVal) return _RetVal;} -#else -#define VERIFY_RET_OK(Func) (Func); -#endif - -#if (SL_PROTOCOL_HANDLING == SL_HANDLING_ASSERT) -#define VERIFY_PROTOCOL(expr) _SL_ASSERT(expr) -#elif (SL_PROTOCOL_HANDLING == SL_HANDLING_ERROR) -#define VERIFY_PROTOCOL(expr) _SL_ERROR(expr, SL_RET_CODE_PROTOCOL_ERROR) -#else -#define VERIFY_PROTOCOL(expr) -#endif - -#if (defined(PROTECT_SOCKET_ASYNC_RESP) && (SL_SELF_COND_HANDLING == SL_HANDLING_ASSERT)) -#define VERIFY_SOCKET_CB(expr) _SL_ASSERT(expr) -#elif (defined(PROTECT_SOCKET_ASYNC_RESP) && (SL_SELF_COND_HANDLING == SL_HANDLING_ERROR)) -#define VERIFY_SOCKET_CB(expr) _SL_ERROR(expr, SL_RET_CODE_SELF_ERROR) -#else -#define VERIFY_SOCKET_CB(expr) -#endif - -#if (SL_NWP_IF_HANDLING == SL_HANDLING_ASSERT) -//#define NWP_IF_WRITE_CHECK(fd,pBuff,len) { int16_t RetSize, ExpSize = (len); RetSize = sl_IfWrite((fd),(pBuff),ExpSize); _SL_ASSERT(ExpSize == RetSize)} -//#define NWP_IF_READ_CHECK(fd,pBuff,len) { int16_t RetSize, ExpSize = (len); RetSize = sl_IfRead((fd),(pBuff),ExpSize); _SL_ASSERT(ExpSize == RetSize)} -#elif (SL_NWP_IF_HANDLING == SL_HANDLING_ERROR) -//#define NWP_IF_WRITE_CHECK(fd,pBuff,len) { _SL_ERROR((len == sl_IfWrite((fd),(pBuff),(len))), SL_RET_CODE_NWP_IF_ERROR);} -//#define NWP_IF_READ_CHECK(fd,pBuff,len) { _SL_ERROR((len == sl_IfRead((fd),(pBuff),(len))), SL_RET_CODE_NWP_IF_ERROR);} -#else -//#define NWP_IF_WRITE_CHECK(fd,pBuff,len) { sl_IfWrite((fd),(pBuff),(len));} -//#define NWP_IF_READ_CHECK(fd,pBuff,len) { sl_IfRead((fd),(pBuff),(len));} -#endif - -#if (SL_OSI_RET_OK_HANDLING == SL_HANDLING_ASSERT) -#define OSI_RET_OK_CHECK(Func) {_SlReturnVal_t _RetVal = (Func); _SL_ASSERT((_SlReturnVal_t)SL_OS_RET_CODE_OK == _RetVal)} -#elif (SL_OSI_RET_OK_HANDLING == SL_HANDLING_ERROR) -#define OSI_RET_OK_CHECK(Func) {_SlReturnVal_t _RetVal = (Func); if (SL_OS_RET_CODE_OK != _RetVal) return _RetVal;} -#else -#define OSI_RET_OK_CHECK(Func) (Func); -#endif - -#if (SL_MALLOC_OK_HANDLING == SL_HANDLING_ASSERT) -#define MALLOC_OK_CHECK(Ptr) _SL_ASSERT(NULL != Ptr) -#elif (SL_MALLOC_OK_HANDLING == SL_HANDLING_ERROR) -#define MALLOC_OK_CHECK(Ptr) _SL_ERROR((NULL != Ptr), SL_RET_CODE_MALLOC_ERROR) -#else -#define MALLOC_OK_CHECK(Ptr) -#endif - -#ifdef SL_INC_ARG_CHECK - -#if (SL_USER_ARGS_HANDLING == SL_HANDLING_ASSERT) -#define ARG_CHECK_PTR(Ptr) _SL_ASSERT(NULL != Ptr) -#elif (SL_USER_ARGS_HANDLING == SL_HANDLING_ERROR) -#define ARG_CHECK_PTR(Ptr) _SL_ERROR((NULL != Ptr), SL_RET_CODE_INVALID_INPUT) -#else -#define ARG_CHECK_PTR(Ptr) -#endif - -#else -#define ARG_CHECK_PTR(Ptr) -#endif - -//#define SL_DBG_TRACE_ENABLE -#ifdef SL_DBG_TRACE_ENABLE -#define SL_TRACE0(level,msg_id,str) printf(str) -#define SL_TRACE1(level,msg_id,str,p1) printf(str,(p1)) -#define SL_TRACE2(level,msg_id,str,p1,p2) printf(str,(p1),(p2)) -#define SL_TRACE3(level,msg_id,str,p1,p2,p3) printf(str,(p1),(p2),(p3)) -#define SL_TRACE4(level,msg_id,str,p1,p2,p3,p4) printf(str,(p1),(p2),(p3),(p4)) -#define SL_ERROR_TRACE(msg_id,str) printf(str) -#define SL_ERROR_TRACE1(msg_id,str,p1) printf(str,(p1)) -#define SL_ERROR_TRACE2(msg_id,str,p1,p2) printf(str,(p1),(p2)) -#define SL_ERROR_TRACE3(msg_id,str,p1,p2,p3) printf(str,(p1),(p2),(p3)) -#define SL_ERROR_TRACE4(msg_id,str,p1,p2,p3,p4) printf(str,(p1),(p2),(p3),(p4)) -#define SL_TRACE_FLUSH() -#else -#define SL_TRACE0(level,msg_id,str) -#define SL_TRACE1(level,msg_id,str,p1) -#define SL_TRACE2(level,msg_id,str,p1,p2) -#define SL_TRACE3(level,msg_id,str,p1,p2,p3) -#define SL_TRACE4(level,msg_id,str,p1,p2,p3,p4) -#define SL_ERROR_TRACE(msg_id,str) -#define SL_ERROR_TRACE1(msg_id,str,p1) -#define SL_ERROR_TRACE2(msg_id,str,p1,p2) -#define SL_ERROR_TRACE3(msg_id,str,p1,p2,p3) -#define SL_ERROR_TRACE4(msg_id,str,p1,p2,p3,p4) -#define SL_TRACE_FLUSH() -#endif - -//#define SL_DBG_CNT_ENABLE -#ifdef SL_DBG_CNT_ENABLE -#define _SL_DBG_CNT_INC(Cnt) g_DbgCnt. ## Cnt++ -#define _SL_DBG_SYNC_LOG(index,value) {if(index < SL_DBG_SYNC_LOG_SIZE){*(uint32_t *)&g_DbgCnt.SyncLog[index] = *(uint32_t *)(value);}} - -#else -#define _SL_DBG_CNT_INC(Cnt) -#define _SL_DBG_SYNC_LOG(index,value) -#endif - -#define SL_DBG_LEVEL_1 1 -#define SL_DBG_LEVEL_2 2 -#define SL_DBG_LEVEL_3 4 -#define SL_DBG_LEVEL_MASK (SL_DBG_LEVEL_2|SL_DBG_LEVEL_3) - -#define SL_INCLUDE_DBG_FUNC(Name) ((Name ## _DBG_LEVEL) & SL_DBG_LEVEL_MASK) - -#define _SlDrvPrintStat_DBG_LEVEL SL_DBG_LEVEL_3 -#define _SlDrvOtherFunc_DBG_LEVEL SL_DBG_LEVEL_1 - - -#endif /*__SIMPLELINK_TRACE_H__*/ - -
--- a/simplelink/cc3100_user.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1035 +0,0 @@ -/* - * user.h - 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. -* -*/ - - -#ifndef USER_H_ -#define USER_H_ - -/*! - - \addtogroup Porting - @{ - -*/ - -/*! - ****************************************************************************** - - \defgroup porting_user_include User Include Files - - This section IS NOT REQUIRED in case user provided primitives are handled - in makefiles or project configurations (IDE) - - PORTING ACTION: - - Include all required header files for the definition of: - -# Transport layer library API (e.g. SPI, UART) - -# OS primitives definitions (e.g. Task spawn, Semaphores) - -# Memory management primitives (e.g. alloc, free) - - ****************************************************************************** - */ - -#include <string.h> - -#ifndef SL_IF_TYPE_UART -#include "cc3100_spi.h" -#else -#include "uart.h" -#endif - - -/*! - ****************************************************************************** - - \defgroup porting_capabilities Capability Set Definition - - This section IS NOT REQUIRED in case one of the following pre defined - capabilities set is in use: - - SL_TINY - - SL_SMALL - - SL_FULL - - PORTING ACTION: - - Define one of the pre-defined capabilities set or uncomment the - relevant definitions below to select the required capabilities - @{ - ******************************************************************************* - */ - -#define SL_FULL - -/*! - \def MAX_CONCURRENT_ACTIONS - - \brief Defines the maximum number of concurrent action in the system - Min:1 , Max: 32 - - Actions which has async events as return, can be - - \sa - - \note In case there are not enough resources for the actions needed in the system, - error is received: POOL_IS_EMPTY - one option is to increase MAX_CONCURRENT_ACTIONS - (improves performance but results in memory consumption) - Other option is to call the API later (decrease performance) - - \warning In case of setting to one, recommend to use non-blocking recv\recvfrom to allow - multiple socket recv -*/ -#define MAX_CONCURRENT_ACTIONS 10 - -/*! - \def CPU_FREQ_IN_MHZ - \brief Defines CPU frequency for Host side, for better accuracy of busy loops, if any - \sa - \note - - \warning If not set the default CPU frequency is set to 200MHz - This option will be deprecated in future release -*/ -/* -#define CPU_FREQ_IN_MHZ 25 -*/ - - -/*! - \def SL_INC_ARG_CHECK - - \brief Defines whether the SimpleLink driver perform argument check - or not - - When defined, the SimpleLink driver perform argument check on - function call. Removing this define could reduce some code - size and improve slightly the performances but may impact in - unpredictable behaviour in case of invalid arguments - - \sa - - \note belongs to \ref porting_sec - - \warning Removing argument check may cause unpredictable behaviour in - case of invalid arguments. - In this case the user is responsible to argument validity - (for example all handlers must not be NULL) -*/ -#define SL_INC_ARG_CHECK - - -/*! - \def SL_INC_STD_BSD_API_NAMING - - \brief Defines whether SimpleLink driver should expose standard BSD - APIs or not - - When defined, the SimpleLink driver in addition to its alternative - BSD APIs expose also standard BSD APIs. - Standard BSD API includes the following functions: - socket , close , accept , bind , listen , connect , select , - setsockopt , getsockopt , recv , recvfrom , write , send , sendto , - gethostbyname - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ - -#define SL_INC_STD_BSD_API_NAMING - - -/*! - \brief Defines whether to include extended API in SimpleLink driver - or not - - When defined, the SimpleLink driver will include also all - extended API of the included packages - - \sa ext_api - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_EXT_API - -/*! - \brief Defines whether to include WLAN package in SimpleLink driver - or not - - When defined, the SimpleLink driver will include also - the WLAN package - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_WLAN_PKG - -/*! - \brief Defines whether to include SOCKET package in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also - the SOCKET package - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_SOCKET_PKG - -/*! - \brief Defines whether to include NET_APP package in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also the - NET_APP package - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_NET_APP_PKG - -/*! - \brief Defines whether to include NET_CFG package in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also - the NET_CFG package - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_NET_CFG_PKG - -/*! - \brief Defines whether to include NVMEM package in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also the - NVMEM package - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_NVMEM_PKG - -/*! - \brief Defines whether to include socket server side APIs - in SimpleLink driver or not - - When defined, the SimpleLink driver will include also socket - server side APIs - - \sa server_side - - \note - - \warning -*/ -#define SL_INC_SOCK_SERVER_SIDE_API - -/*! - \brief Defines whether to include socket client side APIs in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also socket - client side APIs - - \sa client_side - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_SOCK_CLIENT_SIDE_API - -/*! - \brief Defines whether to include socket receive APIs in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also socket - receive side APIs - - \sa recv_api - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_SOCK_RECV_API - -/*! - \brief Defines whether to include socket send APIs in SimpleLink - driver or not - - When defined, the SimpleLink driver will include also socket - send side APIs - - \sa send_api - - \note belongs to \ref porting_sec - - \warning -*/ -#define SL_INC_SOCK_SEND_API - -/*! - - Close the Doxygen group. - @} - - */ - - -/*! - ****************************************************************************** - - \defgroup porting_enable_device Device Enable/Disable IO - - The enable/disable API provide mechanism to enable/disable the network processor - - - PORTING ACTION: - - None - @{ - - ****************************************************************************** - */ -/*! - \brief Preamble to the enabling the Network Processor. - Placeholder to implement any pre-process operations - before enabling networking operations. - - \sa sl_DeviceEnable - - \note belongs to \ref ported_sec - -*/ -#define sl_DeviceEnablePreamble() - -/*! - \brief Enable the Network Processor - - \sa sl_DeviceDisable - - \note belongs to \ref porting_sec - -*/ -//#define sl_DeviceEnable _spi->CC3100_enable - -/*! - \brief Disable the Network Processor - - \sa sl_DeviceEnable - - \note belongs to \ref porting_sec -*/ -//#define sl_DeviceDisable _spi->CC3100_disable - -/*! - - Close the Doxygen group. - @} - - */ - -/*! - ****************************************************************************** - - \defgroup porting_interface Hardware Transport Interface - - The simple link device can work with different transport interfaces - (namely,SPI or UART). Texas Instruments provides single driver - that can work with all these types. This section binds the - physical transport interface with the SimpleLink driver - - - \note Correct and efficient implementation of this driver is critical - for the performances of the SimpleLink device on this platform. - - - PORTING ACTION: - - None - - @{ - - ****************************************************************************** - */ - -#define _SlFd_t int32_t - -/*! - \brief Opens an interface communication port to be used for communicating - with a SimpleLink device - - Given an interface name and option flags, this function opens - the communication port and creates a file descriptor. - This file descriptor is used afterwards to read and write - data from and to this specific communication channel. - The speed, clock polarity, clock phase, chip select and all other - specific attributes of the channel are all should be set to hardcoded - in this function. - - \param ifName - points to the interface name/path. The interface name is an - optional attributes that the simple link driver receives - on opening the driver (sl_Start). - In systems that the spi channel is not implemented as - part of the OS device drivers, this parameter could be NULL. - - \param flags - optional flags parameters for future use - - \return upon successful completion, the function shall open the channel - and return a non-negative integer representing the file descriptor. - Otherwise, -1 shall be returned - - \sa sl_IfClose , sl_IfRead , sl_IfWrite - - \note The prototype of the function is as follow: - Fd_t xxx_IfOpen(char* pIfName , unsigned long flags); - - \note belongs to \ref porting_sec - - \warning -*/ -//#define sl_IfOpen _spi->spi_Open - -/*! - \brief Closes an opened interface communication port - - \param fd - file descriptor of opened communication channel - - \return upon successful completion, the function shall return 0. - Otherwise, -1 shall be returned - - \sa sl_IfOpen , sl_IfRead , sl_IfWrite - - \note The prototype of the function is as follow: - int xxx_IfClose(Fd_t Fd); - - \note belongs to \ref porting_sec - - \warning -*/ -//#define sl_IfClose _spi->spi_Close - -/*! - \brief Attempts to read up to len bytes from an opened communication channel - into a buffer starting at pBuff. - - \param fd - file descriptor of an opened communication channel - - \param pBuff - pointer to the first location of a buffer that contains enough - space for all expected data - - \param len - number of bytes to read from the communication channel - - \return upon successful completion, the function shall return the number of read bytes. - Otherwise, 0 shall be returned - - \sa sl_IfClose , sl_IfOpen , sl_IfWrite - - - \note The prototype of the function is as follow: - int xxx_IfRead(Fd_t Fd , char* pBuff , int Len); - - \note belongs to \ref porting_sec - - \warning -*/ -//#define sl_IfRead _spi->spi_Read - -/*! - \brief attempts to write up to len bytes to the SPI channel - - \param fd - file descriptor of an opened communication channel - - \param pBuff - pointer to the first location of a buffer that contains - the data to send over the communication channel - - \param len - number of bytes to write to the communication channel - - \return upon successful completion, the function shall return the number of sent bytes. - otherwise, 0 shall be returned - - \sa sl_IfClose , sl_IfOpen , sl_IfRead - - \note This function could be implemented as zero copy and return only upon successful completion - of writing the whole buffer, but in cases that memory allocation is not too tight, the - function could copy the data to internal buffer, return back and complete the write in - parallel to other activities as long as the other SPI activities would be blocked until - the entire buffer write would be completed - - The prototype of the function is as follow: - int xxx_IfWrite(Fd_t Fd , char* pBuff , int Len); - - \note belongs to \ref porting_sec - - \warning -*/ -//#define sl_IfWrite _spi->spi_Write - -/*! - \brief register an interrupt handler routine for the host IRQ - - \param InterruptHdl - pointer to interrupt handler routine - - \param pValue - pointer to a memory structure that is passed - to the interrupt handler. - - \return upon successful registration, the function shall return 0. - Otherwise, -1 shall be returned - - \sa - - \note If there is already registered interrupt handler, the function - should overwrite the old handler with the new one - - \note If the handler is a null pointer, the function should un-register the - interrupt handler, and the interrupts can be disabled. - - \note belongs to \ref porting_sec - - \warning -*/ -//#define sl_IfRegIntHdlr(InterruptHdl , pValue) \ -// _spi->registerInterruptHandler(InterruptHdl , pValue) -/*! - \brief Masks the Host IRQ - - \sa sl_IfUnMaskIntHdlr - - - - \note belongs to \ref porting_sec - - \warning -*/ - -//#define sl_IfMaskIntHdlr() - -/*! - \brief Unmasks the Host IRQ - - \sa sl_IfMaskIntHdlr - - - - \note belongs to \ref porting_sec - - \warning -*/ - -//#define sl_IfUnMaskIntHdlr() - -/*! - \brief Write Handers for statistics debug on write - - \param interface handler - pointer to interrupt handler routine - - - \return no return value - - \sa - - \note An optional hooks for monitoring before and after write info - - \note belongs to \ref porting_sec - - \warning -*/ -/* -#define SL_START_WRITE_STAT -*/ - -#ifdef SL_START_WRITE_STAT -#define sl_IfStartWriteSequence -#define sl_IfEndWriteSequence -#endif -/*! - - Close the Doxygen group. - @} - - */ - -/*! - ****************************************************************************** - - \defgroup porting_mem_mgm Memory Management - - This section declare in which memory management model the SimpleLink driver - will run: - -# Static - -# Dynamic - - This section IS NOT REQUIRED in case Static model is selected. - - The default memory model is Static - - PORTING ACTION: - - If dynamic model is selected, define the alloc and free functions. - - @{ - - ***************************************************************************** - */ - -/*! - \brief Defines whether the SimpleLink driver is working in dynamic - memory model or not - - When defined, the SimpleLink driver use dynamic allocations - if dynamic allocation is selected malloc and free functions - must be retrieved - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -/* -#define SL_MEMORY_MGMT_DYNAMIC -*/ - -#ifdef SL_MEMORY_MGMT_DYNAMIC - -/*! - \brief - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define sl_Malloc(Size) malloc(Size) - -/*! - \brief - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define sl_Free(pMem) free(pMem) - -#endif - -/*! - - Close the Doxygen group. - @} - - */ - -/*! - ****************************************************************************** - - \defgroup porting_os Operating System (OS) - - The simple link driver can run on multi-threaded environment as well - as non-os environment (main loop) - - This section IS NOT REQUIRED in case you are working on non-os environment. - - If you choose to work in multi-threaded environment under any operating system - you will have to provide some basic adaptation routines to allow the driver - to protect access to resources from different threads (locking object) and - to allow synchronization between threads (sync objects). - - PORTING ACTION: - -# Uncomment SL_PLATFORM_MULTI_THREADED define - -# Bind locking object routines - -# Bind synchronization object routines - -# Optional - Bind spawn thread routine - - @{ - - ****************************************************************************** - */ - -/* -#define SL_PLATFORM_MULTI_THREADED -*/ - -#ifdef SL_PLATFORM_MULTI_THREADED - -/*! - \brief - \sa - \note belongs to \ref porting_sec - \warning -*/ -//#define SL_OS_RET_CODE_OK - -/*! - \brief - \sa - \note belongs to \ref porting_sec - \warning -*/ -//#define SL_OS_WAIT_FOREVER - -/*! - \brief - \sa - \note belongs to \ref porting_sec - \warning -*/ -//#define SL_OS_NO_WAIT - -/*! - \brief type definition for a time value - - \note On each porting or platform the type could be whatever is needed - integer, pointer to structure etc. - - \note belongs to \ref porting_sec -*/ -//#define _SlTime_t - -/*! - \brief type definition for a sync object container - - Sync object is object used to synchronize between two threads or thread and interrupt handler. - One thread is waiting on the object and the other thread send a signal, which then - release the waiting thread. - The signal must be able to be sent from interrupt context. - This object is generally implemented by binary semaphore or events. - - \note On each porting or platform the type could be whatever is needed - integer, structure etc. - - \note belongs to \ref porting_sec -*/ -//#define _SlSyncObj_t - - -/*! - \brief This function creates a sync object - - The sync object is used for synchronization between different thread or ISR and - a thread. - - \param pSyncObj - pointer to the sync object control block - - \return upon successful creation the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - - \note belongs to \ref porting_sec - \warning -*/ -//#define sl_SyncObjCreate(pSyncObj,pName) - - -/*! - \brief This function deletes a sync object - - \param pSyncObj - pointer to the sync object control block - - \return upon successful deletion the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -//#define sl_SyncObjDelete(pSyncObj) - - -/*! - \brief This function generates a sync signal for the object. - - All suspended threads waiting on this sync object are resumed - - \param pSyncObj - pointer to the sync object control block - - \return upon successful signalling the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note the function could be called from ISR context - \warning -*/ -//#define sl_SyncObjSignal(pSyncObj) - -/*! - \brief This function generates a sync signal for the object from Interrupt - - This is for RTOS that should signal from IRQ using a dedicated API - - \param pSyncObj - pointer to the sync object control block - - \return upon successful signalling the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note the function could be called from ISR context - \warning -*/ -//#define sl_SyncObjSignalFromIRQ(pSyncObj) -/*! - \brief This function waits for a sync signal of the specific sync object - - \param pSyncObj - pointer to the sync object control block - \param Timeout - numeric value specifies the maximum number of mSec to - stay suspended while waiting for the sync signal - Currently, the simple link driver uses only two values: - - OSI_WAIT_FOREVER - - OSI_NO_WAIT - - \return upon successful reception of the signal within the timeout window return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -//#define sl_SyncObjWait(pSyncObj,Timeout) - -/*! - \brief type definition for a locking object container - - Locking object are used to protect a resource from mutual accesses of two or more threads. - The locking object should support reentrant locks by a signal thread. - This object is generally implemented by mutex semaphore - - \note On each porting or platform the type could be whatever is needed - integer, structure etc. - \note belongs to \ref porting_sec -*/ -//#define _SlLockObj_t - -/*! - \brief This function creates a locking object. - - The locking object is used for protecting a shared resources between different - threads. - - \param pLockObj - pointer to the locking object control block - - \return upon successful creation the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -#define sl_LockObjCreate(pLockObj,pName) - -/*! - \brief This function deletes a locking object. - - \param pLockObj - pointer to the locking object control block - - \return upon successful deletion the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -#define sl_LockObjDelete(pLockObj) - -/*! - \brief This function locks a locking object. - - All other threads that call this function before this thread calls - the osi_LockObjUnlock would be suspended - - \param pLockObj - pointer to the locking object control block - \param Timeout - numeric value specifies the maximum number of mSec to - stay suspended while waiting for the locking object - Currently, the simple link driver uses only two values: - - OSI_WAIT_FOREVER - - OSI_NO_WAIT - - - \return upon successful reception of the locking object the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -#define sl_LockObjLock(pLockObj,Timeout) - -/*! - \brief This function unlock a locking object. - - \param pLockObj - pointer to the locking object control block - - \return upon successful unlocking the function should return 0 - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -#define sl_LockObjUnlock(pLockObj) - -#endif -/*! - \brief This function call the pEntry callback from a different context - - \param pEntry - pointer to the entry callback function - - \param pValue - pointer to any type of memory structure that would be - passed to pEntry callback from the execution thread. - - \param flags - execution flags - reserved for future usage - - \return upon successful registration of the spawn the function should return 0 - (the function is not blocked till the end of the execution of the function - and could be returned before the execution is actually completed) - Otherwise, a negative value indicating the error code shall be returned - \note belongs to \ref porting_sec - \warning -*/ -/* -#define SL_PLATFORM_EXTERNAL_SPAWN -*/ - -#ifdef SL_PLATFORM_EXTERNAL_SPAWN -#define sl_Spawn(pEntry,pValue,flags) -#endif - -/*! - - Close the Doxygen group. - @} - - */ - - -/*! - ****************************************************************************** - - \defgroup porting_events Event Handlers - - This section includes the asynchronous event handlers routines - - PORTING ACTION: - -Uncomment the required handler and define your routine as the value - of this handler - - @{ - - ****************************************************************************** - */ - -/*! - \brief - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define sl_GeneralEvtHdlr SimpleLinkGeneralEventHandler - - -/*! - \brief An event handler for WLAN connection or disconnection indication - This event handles async WLAN events. - Possible events are: - SL_WLAN_CONNECT_EVENT - indicates WLAN is connected - SL_WLAN_DISCONNECT_EVENT - indicates WLAN is disconnected - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define sl_WlanEvtHdlr SimpleLinkWlanEventHandler - -/*! - \brief An event handler for IP address asynchronous event. Usually accepted after new WLAN connection. - This event handles networking events. - Possible events are: - SL_NETAPP_IPV4_ACQUIRED - IP address was acquired (DHCP or Static) - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ - -#define sl_NetAppEvtHdlr SimpleLinkNetAppEventHandler - -/*! - \brief A callback for HTTP server events. - Possible events are: - SL_NETAPP_HTTPGETTOKENVALUE - NWP requests to get the value of a specific token - SL_NETAPP_HTTPPOSTTOKENVALUE - NWP post to the host a new value for a specific token - - \param pServerEvent - Contains the relevant event information (SL_NETAPP_HTTPGETTOKENVALUE or SL_NETAPP_HTTPPOSTTOKENVALUE) - - \param pServerResponse - Should be filled by the user with the relevant response information (i.e SL_NETAPP_HTTPSETTOKENVALUE as a response to SL_NETAPP_HTTPGETTOKENVALUE event) - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ - -#define sl_HttpServerCallback SimpleLinkHttpServerCallback - -/*! - \brief - - \sa - - \note belongs to \ref porting_sec - - \warning -*/ -#define sl_SockEvtHdlr SimpleLinkSockEventHandler - - - -/*! - - Close the Doxygen group. - @} - - */ - -#endif /* __USER_H__ */ -
--- a/simplelink/cc3100_wlan.cpp Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,923 +0,0 @@ -/* -* 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 - -
--- a/simplelink/cc3100_wlan.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1317 +0,0 @@ -/* - * wlan.h - 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. - * -*/ - -#ifndef WLAN_H_ -#define WLAN_H_ - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ -#include "cc3100_simplelink.h" - -namespace mbed_cc3100 { - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/*! - - \addtogroup wlan - @{ - -*/ - -const uint8_t SL_BSSID_LENGTH = (6); -const uint8_t MAXIMAL_SSID_LENGTH = (32); - -const uint8_t NUM_OF_RATE_INDEXES = (20); -const uint8_t SIZE_OF_RSSI_HISTOGRAM = (6); - -/* WLAN Disconnect Reason Codes */ -const uint8_t SL_DISCONNECT_RESERVED_0 = (0); -const uint8_t SL_DISCONNECT_UNSPECIFIED_REASON = (1); -const uint8_t SL_PREVIOUS_AUTHENTICATION_NO_LONGER_VALID = (2); -const uint8_t SL_DEAUTHENTICATED_BECAUSE_SENDING_STATION_IS_LEAVING = (3); -const uint8_t SL_DISASSOCIATED_DUE_TO_INACTIVITY = (4); -const uint8_t SL_DISASSOCIATED_BECAUSE_AP_IS_UNABLE_TO_HANDLE_ALL_CURRENTLY_ASSOCIATED_STATIONS = (5); -const uint8_t SL_CLASS_2_FRAME_RECEIVED_FROM_NONAUTHENTICATED_STATION = (6); -const uint8_t SL_CLASS_3_FRAME_RECEIVED_FROM_NONASSOCIATED_STATION = (7); -const uint8_t SL_DISASSOCIATED_BECAUSE_SENDING_STATION_IS_LEAVING_BSS = (8); -const uint8_t SL_STATION_REQUESTING_ASSOCIATION_IS_NOT_AUTHENTICATED_WITH_RESPONDING_STATION = (9); -const uint8_t SL_DISASSOCIATED_BECAUSE_THE_INFORMATION_IN_THE_POWER_CAPABILITY_ELEMENT_IS_UNACCEPTABLE = (10); -const uint8_t SL_DISASSOCIATED_BECAUSE_THE_INFORMATION_IN_THE_SUPPORTED_CHANNELS_ELEMENT_IS_UNACCEPTABLE = (11); -const uint8_t SL_DISCONNECT_RESERVED_1 = (12); -const uint8_t SL_INVALID_INFORMATION_ELEMENT = (13); -const uint8_t SL_MESSAGE_INTEGRITY_CODE_MIC_FAILURE = (14); -const uint8_t SL_FOUR_WAY_HANDSHAKE_TIMEOUT = (15); -const uint8_t SL_GROUP_KEY_HANDSHAKE_TIMEOUT = (16); -const uint8_t SL_RE_ASSOCIATION_REQUEST_PROBE_RESPONSE_BEACON_FRAME = (17); -const uint8_t SL_INVALID_GROUP_CIPHER = (18); -const uint8_t SL_INVALID_PAIRWISE_CIPHER = (19); -const uint8_t SL_INVALID_AKMP = (20); -const uint8_t SL_UNSUPPORTED_RSN_INFORMATION_ELEMENT_VERSION = (21); -const uint8_t SL_INVALID_RSN_INFORMATION_ELEMENT_CAPABILITIES = (22); -const uint8_t SL_IEEE_802_1X_AUTHENTICATION_FAILED = (23); -const uint8_t SL_CIPHER_SUITE_REJECTED_BECAUSE_OF_THE_SECURITY_POLICY = (24); -const uint8_t SL_DISCONNECT_RESERVED_2 = (25); -const uint8_t SL_DISCONNECT_RESERVED_3 = (26); -const uint8_t SL_DISCONNECT_RESERVED_4 = (27); -const uint8_t SL_DISCONNECT_RESERVED_5 = (28); -const uint8_t SL_DISCONNECT_RESERVED_6 = (29); -const uint8_t SL_DISCONNECT_RESERVED_7 = (30); -const uint8_t SL_DISCONNECT_RESERVED_8 = (31); -const uint8_t SL_DISASSOCIATED_FOR_UNSPECIFIED_QOS_RELATED_REASON = (32); -const uint8_t SL_DISASSOCIATED_BECAUSE_QAP_LACKS_SUFFICIENT_BANDWIDTH_FOR_THIS_QSTA = (33); -const uint8_t SL_DISASSOCIATED_BECAUSE_EXCESSIVE_NUMBER_OF_FRAMES_NEED_TO_BE_ACKNOWLEDGED = (34); -const uint8_t SL_DISASSOCIATED_BECAUSE_QSTA_IS_TRANSMITTING_OUTSIDE_THE_LIMITS_OF_ITS_TXOPS = (35); -const uint8_t SL_REQUESTED_FROM_PEER_QSTA_AS_THE_QSTA_IS_LEAVING_THE_QBSS = (36); -const uint8_t SL_REQUESTED_FROM_PEER_QSTA_AS_IT_DOES_NO_WANT_TO_USE_THE_MECHANISM = (37); -const uint8_t SL_REQUESTED_FROM_PEER_QSTA_AS_THE_QSTA_RECEIVED_FRAMES_SETUP_IS_REQUIRED = (38); -const uint8_t SL_REQUESTED_FROM_PEER_QSTA_DUE_TO_TIMEOUT = (39); -const uint8_t SL_PEER_QSTA_DOES_NOT_SUPPORT_THE_REQUESTED_CIPHER_SUITE = (40); -const uint8_t SL_CISCO_DEFINED = (98); -const uint8_t SL_CISCO_DEFINED_1 = (99); -const uint8_t SL_ROAMING_TRIGGER_NONE = (100); -const uint8_t SL_ROAMING_TRIGGER_LOW_QUALITY_FOR_BG_SCAN = (101); -const uint8_t SL_ROAMING_TRIGGER_HIGH_QUALITY_FOR_BG_SCAN = (102); -const uint8_t SL_ROAMING_TRIGGER_NORMAL_QUALITY_FOR_BG_SCAN = (103); -const uint8_t SL_ROAMING_TRIGGER_LOW_TX_RATE = (104); -const uint8_t SL_ROAMING_TRIGGER_LOW_SNR = (105); -const uint8_t SL_ROAMING_TRIGGER_LOW_QUALITY = (106); -const uint8_t SL_ROAMING_TRIGGER_TSPEC_REJECTED = (107); -const uint8_t SL_ROAMING_TRIGGER_MAX_TX_RETRIES = (108); -const uint8_t SL_ROAMING_TRIGGER_BSS_LOSS = (109); -const uint8_t SL_ROAMING_TRIGGER_BSS_LOSS_DUE_TO_MAX_TX_RETRY = (110); -const uint8_t SL_ROAMING_TRIGGER_SWITCH_CHANNEL = (111); -const uint8_t SL_ROAMING_TRIGGER_AP_DISCONNECT = (112); -const uint8_t SL_ROAMING_TRIGGER_SECURITY_ATTACK = (113); -const uint8_t SL_ROAMING_TRIGGER_MAX = (114); -const uint8_t SL_USER_INITIATED_DISCONNECTION = (200); - -/* Wlan error codes */ -const int8_t SL_ERROR_KEY_ERROR = (-3); -const int8_t SL_ERROR_INVALID_ROLE = (-71); -const int8_t SL_ERROR_INVALID_SECURITY_TYPE = (-84); -const int8_t SL_ERROR_PASSPHRASE_TOO_LONG = (-85); -const int8_t SL_ERROR_WPS_NO_PIN_OR_WRONG_PIN_LEN = (-87); -const int8_t SL_ERROR_EAP_WRONG_METHOD = (-88); -const int8_t SL_ERROR_PASSWORD_ERROR = (-89); -const int8_t SL_ERROR_EAP_ANONYMOUS_LEN_ERROR = (-90); -const int8_t SL_ERROR_SSID_LEN_ERROR = (-91); -const int8_t SL_ERROR_USER_ID_LEN_ERROR = (-92); -const int8_t SL_ERROR_ILLEGAL_WEP_KEY_INDEX = (-95); -const int8_t SL_ERROR_INVALID_DWELL_TIME_VALUES = (-96); -const int8_t SL_ERROR_INVALID_POLICY_TYPE = (-97); -const int8_t SL_ERROR_PM_POLICY_INVALID_OPTION = (-98); -const int8_t SL_ERROR_PM_POLICY_INVALID_PARAMS = (-99); -const int16_t SL_ERROR_WIFI_ALREADY_DISCONNECTED = (-129); -const int8_t SL_ERROR_WIFI_NOT_CONNECTED = (-59); - - - -const uint8_t SL_SEC_TYPE_OPEN = (0); -const uint8_t SL_SEC_TYPE_WEP = (1); -const uint8_t SL_SEC_TYPE_WPA = (2); /* deprecated */ -const uint8_t SL_SEC_TYPE_WPA_WPA2 = (2); -const uint8_t SL_SEC_TYPE_WPS_PBC = (3); -const uint8_t SL_SEC_TYPE_WPS_PIN = (4); -const uint8_t SL_SEC_TYPE_WPA_ENT = (5); -const uint8_t SL_SEC_TYPE_P2P_PBC = (6); -const uint8_t SL_SEC_TYPE_P2P_PIN_KEYPAD = (7); -const uint8_t SL_SEC_TYPE_P2P_PIN_DISPLAY = (8); -const uint8_t SL_SEC_TYPE_P2P_PIN_AUTO = (9); /* NOT Supported yet */ - - - -const uint8_t SL_SCAN_SEC_TYPE_OPEN = (0); -const uint8_t SL_SCAN_SEC_TYPE_WEP = (1); -const uint8_t SL_SCAN_SEC_TYPE_WPA = (2); -const uint8_t SL_SCAN_SEC_TYPE_WPA2 = (3); - - - -const uint8_t TLS = (0x1); -const uint8_t MSCHAP = (0x0); -const uint8_t PSK = (0x2); -const uint8_t TTLS = (0x10); -const uint8_t PEAP0 = (0x20); -const uint8_t PEAP1 = (0x40); -const uint8_t FAST = (0x80); - -const uint8_t FAST_AUTH_PROVISIONING = (0x02); -const uint8_t FAST_UNAUTH_PROVISIONING = (0x01); -const uint8_t FAST_NO_PROVISIONING = (0x00); - -const uint8_t EAPMETHOD_PHASE2_SHIFT = (8); -const uint8_t EAPMETHOD_PAIRWISE_CIPHER_SHIFT = (19); -const uint8_t EAPMETHOD_GROUP_CIPHER_SHIFT = (27); - -const uint8_t WPA_CIPHER_CCMP = (0x1); -const uint8_t WPA_CIPHER_TKIP = (0x2); -const uint8_t CC31XX_DEFAULT_CIPHER = (WPA_CIPHER_CCMP | WPA_CIPHER_TKIP); - -#define EAPMETHOD(phase1,phase2,pairwise_cipher,group_cipher) \ -((phase1) | \ - ((phase2) << EAPMETHOD_PHASE2_SHIFT ) |\ - ((uint32_t)(pairwise_cipher) << EAPMETHOD_PAIRWISE_CIPHER_SHIFT ) |\ - ((uint32_t)(group_cipher) << EAPMETHOD_GROUP_CIPHER_SHIFT )) - -/* phase1 phase2 pairwise_cipher group_cipher */ -#define SL_ENT_EAP_METHOD_TLS EAPMETHOD(TLS , 0 , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_TTLS_TLS EAPMETHOD(TTLS , TLS , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_TTLS_MSCHAPv2 EAPMETHOD(TTLS , MSCHAP , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_TTLS_PSK EAPMETHOD(TTLS , PSK , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP0_TLS EAPMETHOD(PEAP0 , TLS , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP0_MSCHAPv2 EAPMETHOD(PEAP0 , MSCHAP , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP0_PSK EAPMETHOD(PEAP0 , PSK , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP1_TLS EAPMETHOD(PEAP1 , TLS , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP1_MSCHAPv2 EAPMETHOD(PEAP1 , MSCHAP , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_PEAP1_PSK EAPMETHOD(PEAP1 , PSK , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_FAST_AUTH_PROVISIONING EAPMETHOD(FAST , FAST_AUTH_PROVISIONING , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_FAST_UNAUTH_PROVISIONING EAPMETHOD(FAST , FAST_UNAUTH_PROVISIONING , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) -#define SL_ENT_EAP_METHOD_FAST_NO_PROVISIONING EAPMETHOD(FAST , FAST_NO_PROVISIONING , CC31XX_DEFAULT_CIPHER , CC31XX_DEFAULT_CIPHER) - -const uint8_t SL_LONG_PREAMBLE = (0); -const uint8_t SL_SHORT_PREAMBLE = (1); - -const uint8_t SL_RAW_RF_TX_PARAMS_CHANNEL_SHIFT = (0); -const uint8_t SL_RAW_RF_TX_PARAMS_RATE_SHIFT = (6); -const uint8_t SL_RAW_RF_TX_PARAMS_POWER_SHIFT = (11); -const uint8_t SL_RAW_RF_TX_PARAMS_PREAMBLE_SHIFT = (15); - -#define SL_RAW_RF_TX_PARAMS(chan,rate,power,preamble) \ - ((chan << SL_RAW_RF_TX_PARAMS_CHANNEL_SHIFT) | \ - (rate << SL_RAW_RF_TX_PARAMS_RATE_SHIFT) | \ - (power << SL_RAW_RF_TX_PARAMS_POWER_SHIFT) | \ - (preamble << SL_RAW_RF_TX_PARAMS_PREAMBLE_SHIFT)) - - -/* wlan config application IDs */ -const uint8_t SL_WLAN_CFG_AP_ID = (0); -const uint8_t SL_WLAN_CFG_GENERAL_PARAM_ID = (1); -const uint8_t SL_WLAN_CFG_P2P_PARAM_ID = (2); - -/* wlan AP Config set/get options */ -const uint8_t WLAN_AP_OPT_SSID = (0); -const uint8_t WLAN_AP_OPT_CHANNEL = (3); -const uint8_t WLAN_AP_OPT_HIDDEN_SSID = (4); -const uint8_t WLAN_AP_OPT_SECURITY_TYPE = (6); -const uint8_t WLAN_AP_OPT_PASSWORD = (7); -const uint8_t WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE = (9); -const uint8_t WLAN_GENERAL_PARAM_OPT_STA_TX_POWER = (10); -const uint8_t WLAN_GENERAL_PARAM_OPT_AP_TX_POWER = (11); - -const uint8_t WLAN_P2P_OPT_DEV_NAME = (12); -const uint8_t WLAN_P2P_OPT_DEV_TYPE = (13); -const uint8_t WLAN_P2P_OPT_CHANNEL_N_REGS = (14); -const uint8_t WLAN_GENERAL_PARAM_OPT_INFO_ELEMENT = (16); -const uint8_t WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS = (18); /* change the scan channels and RSSI threshold using this configuration option */ - -/* SmartConfig CIPHER options */ -const uint8_t SMART_CONFIG_CIPHER_SFLASH = (0); /* password is not delivered by the application. The Simple Manager should */ -/* check if the keys are stored in the Flash. */ -const uint8_t SMART_CONFIG_CIPHER_AES = (1); /* AES (other types are not supported) */ -const uint8_t SMART_CONFIG_CIPHER_NONE = (0xFF); /* do not check in the flash */ - - -const uint8_t SL_POLICY_CONNECTION = (0x10); -const uint8_t SL_POLICY_SCAN = (0x20); -const uint8_t SL_POLICY_PM = (0x30); -const uint8_t SL_POLICY_P2P = (0x40); - -#define VAL_2_MASK(position,value) ((1 & (value))<<(position)) -#define MASK_2_VAL(position,mask) (((1 << position) & (mask)) >> (position)) - -#define SL_CONNECTION_POLICY(Auto,Fast,Open,anyP2P,autoSmartConfig) (VAL_2_MASK(0,Auto) | VAL_2_MASK(1,Fast) | VAL_2_MASK(2,Open) | VAL_2_MASK(3,anyP2P) | VAL_2_MASK(4,autoSmartConfig)) -#define SL_SCAN_POLICY_EN(policy) (MASK_2_VAL(0,policy)) -#define SL_SCAN_POLICY(Enable) (VAL_2_MASK(0,Enable)) - - -const uint8_t SL_NORMAL_POLICY = (0); -const uint8_t SL_LOW_LATENCY_POLICY = (1); -const uint8_t SL_LOW_POWER_POLICY = (2); -const uint8_t SL_ALWAYS_ON_POLICY = (3); -const uint8_t SL_LONG_SLEEP_INTERVAL_POLICY = (4); - -const uint8_t SL_P2P_ROLE_NEGOTIATE = (3); -const uint8_t SL_P2P_ROLE_GROUP_OWNER = (15); -const uint8_t SL_P2P_ROLE_CLIENT = (0); - -const uint8_t SL_P2P_NEG_INITIATOR_ACTIVE = (0); -const uint8_t SL_P2P_NEG_INITIATOR_PASSIVE = (1); -const uint8_t SL_P2P_NEG_INITIATOR_RAND_BACKOFF = (2); - -#define POLICY_VAL_2_OPTIONS(position,mask,policy) ((mask & policy) << position ) - -#define SL_P2P_POLICY(p2pNegType,p2pNegInitiator) (POLICY_VAL_2_OPTIONS(0,0xF,(p2pNegType > SL_P2P_ROLE_GROUP_OWNER ? SL_P2P_ROLE_GROUP_OWNER : p2pNegType)) | \ - POLICY_VAL_2_OPTIONS(4,0x1,(p2pNegType > SL_P2P_ROLE_GROUP_OWNER ? 1:0)) | \ - POLICY_VAL_2_OPTIONS(5,0x3, p2pNegInitiator)) - - -/* Info elements */ - -const uint8_t INFO_ELEMENT_DEFAULT_ID = (0); /* 221 will be used */ - -/* info element size is up to 252 bytes (+ 3 bytes of OUI). */ -const uint8_t INFO_ELEMENT_MAX_SIZE = (252); - -/* For AP - the total length of all info elements is 300 bytes (for example - 4 info elements of 75 bytes each) */ -const uint16_t INFO_ELEMENT_MAX_TOTAL_LENGTH_AP = (300); -/* For P2P - the total length of all info elements is 150 bytes (for example - 4 info elements of 40 bytes each) */ -const uint8_t INFO_ELEMENT_MAX_TOTAL_LENGTH_P2P_GO (160); - -const uint8_t INFO_ELEMENT_AP_ROLE = (0); -const uint8_t INFO_ELEMENT_P2P_GO_ROLE = (1); - -/* we support up to 4 info elements per Role. */ -const uint8_t MAX_PRIVATE_INFO_ELEMENTS_SUPPROTED = (4); - -const uint8_t INFO_ELEMENT_DEFAULT_OUI_0 = (0x08); -const uint8_t INFO_ELEMENT_DEFAULT_OUI_1 = (0x00); -const uint8_t INFO_ELEMENT_DEFAULT_OUI_2 = (0x28); - -const uint32_t INFO_ELEMENT_DEFAULT_OUI = (0x000000); /* 08, 00, 28 will be used */ - - -/*****************************************************************************/ -/* Structure/Enum declarations */ -/*****************************************************************************/ - -typedef enum { - RATE_1M = 1, - RATE_2M = 2, - RATE_5_5M = 3, - RATE_11M = 4, - RATE_6M = 6, - RATE_9M = 7, - RATE_12M = 8, - RATE_18M = 9, - RATE_24M = 10, - RATE_36M = 11, - RATE_48M = 12, - RATE_54M = 13, - RATE_MCS_0 = 14, - RATE_MCS_1 = 15, - RATE_MCS_2 = 16, - RATE_MCS_3 = 17, - RATE_MCS_4 = 18, - RATE_MCS_5 = 19, - RATE_MCS_6 = 20, - RATE_MCS_7 = 21, - MAX_NUM_RATES = 0xFF -} SlRateIndex_e; - -typedef enum { - DEV_PW_DEFAULT=0, - DEV_PW_PIN_KEYPAD=1, - DEV_PW_PUSH_BUTTON=4, - DEV_PW_PIN_DISPLAY=5 -} sl_p2p_dev_password_method; - - -typedef struct { - uint32_t status; - uint32_t ssid_len; - uint8_t ssid[32]; - uint32_t private_token_len; - uint8_t private_token[32]; -} slSmartConfigStartAsyncResponse_t; - -typedef struct { - uint16_t status; - uint16_t padding; -} slSmartConfigStopAsyncResponse_t; - -typedef struct { - uint16_t status; - uint16_t padding; -} slWlanConnFailureAsyncResponse_t; - -typedef struct { - uint8_t connection_type;/* 0-STA,3-P2P_CL */ - uint8_t ssid_len; - uint8_t ssid_name[32]; - uint8_t go_peer_device_name_len; - uint8_t go_peer_device_name[32]; - uint8_t bssid[6]; - uint8_t reason_code; - uint8_t padding[2]; -} slWlanConnectAsyncResponse_t; - -typedef struct { - uint8_t go_peer_device_name[32]; - uint8_t mac[6]; - uint8_t go_peer_device_name_len; - uint8_t wps_dev_password_id; - uint8_t own_ssid[32];/* relevant for event sta-connected only */ - uint8_t own_ssid_len;/* relevant for event sta-connected only */ - uint8_t padding[3]; -} slPeerInfoAsyncResponse_t; - - -typedef union { - slSmartConfigStartAsyncResponse_t smartConfigStartResponse; /*SL_WLAN_SMART_CONFIG_COMPLETE_EVENT*/ - slSmartConfigStopAsyncResponse_t smartConfigStopResponse; /*SL_WLAN_SMART_CONFIG_STOP_EVENT */ - slPeerInfoAsyncResponse_t APModeStaConnected; /* SL_WLAN_STA_CONNECTED_EVENT - relevant only in AP mode - holds information regarding a new STA connection */ - slPeerInfoAsyncResponse_t APModestaDisconnected; /* SL_WLAN_STA_DISCONNECTED_EVENT - relevant only in AP mode - holds information regarding a STA disconnection */ - slWlanConnectAsyncResponse_t STAandP2PModeWlanConnected; /* SL_WLAN_CONNECT_EVENT - relevant only in STA and P2P mode - holds information regarding a new connection */ - slWlanConnectAsyncResponse_t STAandP2PModeDisconnected; /* SL_WLAN_DISCONNECT_EVENT - relevant only in STA and P2P mode - holds information regarding a disconnection */ - slPeerInfoAsyncResponse_t P2PModeDevFound; /* SL_WLAN_P2P_DEV_FOUND_EVENT - relevant only in P2P mode */ - slPeerInfoAsyncResponse_t P2PModeNegReqReceived; /* SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT - relevant only in P2P mode */ - slWlanConnFailureAsyncResponse_t P2PModewlanConnectionFailure; /* SL_WLAN_CONNECTION_FAILED_EVENT - relevant only in P2P mode */ - -} SlWlanEventData_u; - -typedef struct { - uint32_t Event; - SlWlanEventData_u EventData; -} SlWlanEvent_t; - - -typedef struct { - uint32_t ReceivedValidPacketsNumber; /* sum of the packets that been received OK (include filtered) */ - uint32_t ReceivedFcsErrorPacketsNumber; /* sum of the packets that been dropped due to FCS error */ - uint32_t ReceivedPlcpErrorPacketsNumber; /* sum of the packets that been dropped due to PLCP error */ - int16_t AvarageDataCtrlRssi; /* average RSSI for all valid data packets received */ - int16_t AvarageMgMntRssi; /* average RSSI for all valid management packets received */ - uint16_t RateHistogram[NUM_OF_RATE_INDEXES]; /* rate histogram for all valid packets received */ - uint16_t RssiHistogram[SIZE_OF_RSSI_HISTOGRAM]; /* RSSI histogram from -40 until -87 (all below and above\n RSSI will appear in the first and last cells */ - uint32_t StartTimeStamp; /* the time stamp started collecting the statistics in uSec */ - uint32_t GetTimeStamp; /* the time stamp called the get statistics command */ -} SlGetRxStatResponse_t; - - -typedef struct { - uint8_t ssid[MAXIMAL_SSID_LENGTH]; - uint8_t ssid_len; - uint8_t sec_type; - uint8_t bssid[SL_BSSID_LENGTH]; - int8_t rssi; - int8_t reserved[3]; -} Sl_WlanNetworkEntry_t; - - -typedef struct { - uint8_t Type; - int8_t* Key; - uint8_t KeyLen; -} SlSecParams_t; - -typedef struct { - int8_t* User; - uint8_t UserLen; - int8_t* AnonUser; - uint8_t AnonUserLen; - uint8_t CertIndex; /* not supported */ - uint32_t EapMethod; -} SlSecParamsExt_t; - -typedef struct { - int8_t User[32]; - uint8_t UserLen; - int8_t AnonUser[32]; - uint8_t AnonUserLen; - uint8_t CertIndex; //not supported - uint32_t EapMethod; -} SlGetSecParamsExt_t; - -typedef enum { - ROLE_STA = 0, - ROLE_AP = 2, - ROLE_P2P = 3, - ROLE_STA_ERR = -1, /* Failure to load MAC/PHY in STA role */ - ROLE_AP_ERR = -ROLE_AP, /* Failure to load MAC/PHY in AP role */ - ROLE_P2P_ERR = -ROLE_P2P /* Failure to load MAC/PHY in P2P role */ -} SlWlanMode_t; - -typedef struct { - uint32_t G_Channels_mask; - int32_t rssiThershold; -} slWlanScanParamCommand_t; - - -typedef struct { - uint8_t id; - uint8_t oui[3]; - uint16_t length; - uint8_t data[252]; -} sl_protocol_InfoElement_t; - -typedef struct { - uint8_t index; /* 0 - MAX_PRIVATE_INFO_ELEMENTS_SUPPROTED */ - uint8_t role; /* bit0: AP = 0, GO = 1 */ - sl_protocol_InfoElement_t ie; -} sl_protocol_WlanSetInfoElement_t; - - -class cc3100_wlan_rx_filters; -class cc3100_wlan -{ - -public: - - cc3100_wlan(cc3100_driver &driver, cc3100_wlan_rx_filters &wlan_rx_filters); - - ~cc3100_wlan(); - - - /*****************************************************************************/ - /* Function prototypes */ - /*****************************************************************************/ - - - /*! - \brief Connect to wlan network as a station - - \param[in] sec_type security types options: \n - - SL_SEC_TYPE_OPEN - - SL_SEC_TYPE_WEP - - SL_SEC_TYPE_WPA_WPA2 - - SL_SEC_TYPE_WPA_ENT - - SL_SEC_TYPE_WPS_PBC - - SL_SEC_TYPE_WPS_PIN - - \param[in] pName up to 32 bytes in case of STA the name is the SSID of the Access Point - \param[in] NameLen name length - \param[in] pMacAddr 6 bytes for MAC address - \param[in] pSecParams Security parameters (use NULL key for SL_SEC_TYPE_OPEN) - \param[in] pSecExtParams Enterprise parameters (set NULL in case Enterprise parameters is not in use) - - \return On success, zero is returned. On error, negative is returned - In case error number (-71) is returned, it indicates a connection was activated while the device it running in AP role - - \sa sl_WlanDisconnect - \note belongs to \ref ext_api - \warning In this version only single enterprise mode could be used - SL_SEC_TYPE_WPA is a deprecated definition, the new definition is SL_SEC_TYPE_WPA_WPA2 - */ -#if _SL_INCLUDE_FUNC(sl_WlanConnect) - int16_t sl_WlanConnect(signed char* pName, int16_t NameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams , SlSecParamsExt_t* pSecExtParams); -#endif - - /*! - \brief wlan disconnect - - Disconnect connection - - \return 0 disconnected done, other already disconnected - - \sa sl_WlanConnect - \note belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_WlanDisconnect) - int16_t sl_WlanDisconnect(void); -#endif - - /*! - \brief add profile - - When auto start is enabled, the device connects to a - station from the profiles table. Up to 7 profiles are - supported. If several profiles configured the device chose - the highest priority profile, within each priority group, - device will chose profile based on security policy, signal - strength, etc parameters. - - - \param[in] pName up to 32 bytes in case of STA the name is the - SSID of the Access Point - in case of P2P the name is the remote device name - \param[in] NameLen name length - \param[in] pMacAddr 6 bytes for MAC address - \param[in] pSecParams Security parameters - security type - (SL_SEC_TYPE_OPEN,SL_SEC_TYPE_WEP,SL_SEC_TYPE_WPA_WPA2, - SL_SEC_TYPE_P2P_PBC,SL_SEC_TYPE_P2P_PIN_KEYPAD,SL_SEC_TYPE_P2P_PIN_DISPLAY, SL_SEC_TYPE_WPA_ENT), key, and key length - in case of p2p security type pin the key refers to pin code - \param[in] pSecExtParams Enterprise parameters - identity, identity length, - Anonymous, Anonymous length, CertIndex (not supported, - certificates need to be placed in a specific file ID), - EapMethod.Use NULL in case Enterprise parameters is not in use - - \param[in] Priority profile priority. Lowest priority: 0 - \param[in] Options Not supported - - \return On success, profile stored index is returned. On error, negative value is returned - - \sa sl_WlanProfileGet , sl_WlanProfileDel - \note belongs to \ref ext_api - \warning Only one Enterprise profile is supported. - Please Note that in case of adding an existing profile (compared by pName,pMACAddr and security type) - the old profile will be deleted and the same index will be returned. - SL_SEC_TYPE_WPA is a deprecated definition, the new definition is SL_SEC_TYPE_WPA_WPA2 - - */ -#if _SL_INCLUDE_FUNC(sl_WlanProfileAdd) - int16_t sl_WlanProfileAdd(int8_t* pName, int16_t NameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams , SlSecParamsExt_t* pSecExtParams, uint32_t Priority, uint32_t Options); -#endif - - /*! - \brief get profile - - read profile from the device - - \param[in] Index profile stored index, if index does not exists - error is return - \param[out] pName up to 32 bytes, in case of sta mode the name of the Access Point - in case of p2p mode the name of the Remote Device - \param[out] pNameLen name length - \param[out] pMacAddr 6 bytes for MAC address - \param[out] pSecParams security parameters - security type - (LAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or - WLAN_SEC_WPA2, WLAN_SEC_P2P_PBC, WLAN_SEC_P2P_PIN_KEYPAD or WLAN_SEC_P2P_DISPLAY), key and key length are not - in case of p2p security type pin the key refers to pin code - return due to security reasons. - \param[out] pSecExtParams enterprise parameters - identity, identity - length, Anonymous, Anonymous length - CertIndex (not supported), EapMethod. - \param[out] Priority profile priority - - \return On success, Profile security type is returned (0 or positive number). On error, -1 is - returned - - \sa sl_WlanProfileAdd , sl_WlanProfileDel - \note belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_WlanProfileGet) - int16_t sl_WlanProfileGet(int16_t Index,int8_t* pName, int16_t *pNameLen, uint8_t *pMacAddr, SlSecParams_t* pSecParams, SlGetSecParamsExt_t* pSecExtParams, uint32_t *pPriority); -#endif - - /*! - \brief Delete WLAN profile - - Delete WLAN profile - - \param[in] index number of profile to delete.Possible values are 0 to 6. - Index value 255 will delete all saved profiles - - \return On success, zero is returned. On error, -1 is - returned - - \sa sl_WlanProfileAdd , sl_WlanProfileGet - \note belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_WlanProfileDel) - int16_t sl_WlanProfileDel(int16_t Index); -#endif - - /*! - \brief Set policy values - - \param[in] Type Type of policy to be modified. The Options are:\n - - SL_POLICY_CONNECTION - - SL_POLICY_SCAN - - SL_POLICY_PM - - SL_POLICY_P2P - \param[in] Policy The option value which depends on action type - \param[in] pVal An optional value pointer - \param[in] ValLen An optional value length, in bytes - \return On success, zero is returned. On error, -1 is - returned - \sa sl_WlanPolicyGet - \note belongs to \ref ext_api - \warning - \par - SL_POLICY_CONNECTION type defines three options available to connect the CC31xx device to the AP: \n - - - If Auto Connect is set, the CC31xx device tries to automatically reconnect to one of its stored profiles, each time the connection fails or the device is rebooted.\n - To set this option, use: \n - <b> sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(1,0,0,0,0),NULL,0) </b> - - If Fast Connect is set, the CC31xx device tries to establish a fast connection to AP. \n - To set this option, use: \n - <b> sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(0,1,0,0,0),NULL,0) </b> - - (relevant for P2P mode only) - If Any P2P is set, CC31xx/CC32xx device tries to automatically connect to the first P2P device available, \n - supporting push button only. To set this option, use: \n - <b> sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(0,0,0,1,0),NULL,0) </b> - - For auto smart config upon restart (any command from Host will end this state) use: \n - <b> sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(0,0,0,0,1),NULL,0) </b> \n - The options above could be combined to a single action, if more than one action is required. \n - \par - SL_POLICY_SCAN defines system scan time interval in case there is no connection. Default interval is 10 minutes. \n - After settings scan interval, an immediate scan is activated. The next scan will be based on the interval settings. \n - - For example, setting scan interval to 1 minute interval use: \n - uint32_t intervalInSeconds = 60; \n - #define SL_SCAN_ENABLE 1 \n<b> - sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_ENABLE, (uint8_t *)&intervalInSeconds,sizeof(intervalInSeconds)); </b>\n - - - For example, disable scan: \n - #define SL_SCAN_DISABLE 0 \n<b> - sl_WlanPolicySet(SL_POLICY_SCAN,SL_SCAN_DISABLE,0,0); </b>\n - \par - SL_POLICY_PM defines a power management policy for Station mode only: - - For setting normal power management (default) policy use: <b> sl_WlanPolicySet(SL_POLICY_PM , SL_NORMAL_POLICY, NULL,0) </b> - - For setting low latency power management policy use: <b> sl_WlanPolicySet(SL_POLICY_PM , SL_LOW_LATENCY_POLICY, NULL,0) </b> - - For setting low power management policy use: <b> sl_WlanPolicySet(SL_POLICY_PM , SL_LOW_POWER_POLICY, NULL,0) </b> - - For setting always on power management policy use: <b> sl_WlanPolicySet(SL_POLICY_PM , SL_ALWAYS_ON_POLICY, NULL,0) </b> - - For setting Long Sleep Interval policy use: \n - uint16_t PolicyBuff[4] = {0,0,800,0}; // PolicyBuff[2] is max sleep time in mSec \n<b> - sl_WlanPolicySet(SL_POLICY_PM , SL_LONG_SLEEP_INTERVAL_POLICY, (uint8_t*)PolicyBuff,sizeof(PolicyBuff)); </b>\n - - SL_POLICY_P2P defines p2p negotiation policy parameters for P2P role: - - To set intent negotiation value, set on of the following: - SL_P2P_ROLE_NEGOTIATE - intent 3 - SL_P2P_ROLE_GROUP_OWNER - intent 15 - SL_P2P_ROLE_CLIENT - intent 0 - - To set negotiation initiator value (initiator policy of first negotiation action frame), set on of the following: - SL_P2P_NEG_INITIATOR_ACTIVE - SL_P2P_NEG_INITIATOR_PASSIVE - SL_P2P_NEG_INITIATOR_RAND_BACKOFF - For example: \n - <b>sl_WlanPolicySet(SL_POLICY_P2P, SL_P2P_POLICY(SL_P2P_ROLE_NEGOTIATE,SL_P2P_NEG_INITIATOR_RAND_BACKOFF),NULL,0) </b> - - */ -#if _SL_INCLUDE_FUNC(sl_WlanPolicySet) - int16_t sl_WlanPolicySet(uint8_t Type , const uint8_t Policy, uint8_t *pVal,uint8_t ValLen); -#endif - /*! - \brief get policy values - - \param[in] Type SL_POLICY_CONNECTION, SL_POLICY_SCAN, SL_POLICY_PM,SL_POLICY_P2P \n - - \param[in] Policy argument may be set to any value \n - - \param[out] The returned values, depends on each policy type, will be stored in the allocated buffer pointed by pVal - with a maximum buffer length set by the calling function and pointed to by argument *pValLen - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_WlanPolicySet - - \note belongs to \ref ext_api - - \warning The value pointed by the argument *pValLen should be set to a value different from 0 and - greater than the buffer length returned from the SL device. Otherwise, an error will be returned. - - */ -#if _SL_INCLUDE_FUNC(sl_WlanPolicyGet) - int16_t sl_WlanPolicyGet(uint8_t Type , uint8_t Policy,uint8_t *pVal,uint8_t *pValLen); -#endif - /*! - \brief Gets the WLAN scan operation results - - Gets scan results , gets entry from scan result table - - \param[in] Index - Starting index identifier (range 0-19) for getting scan results - \param[in] Count - How many entries to fetch. Max is (20-"Index"). - \param[out] pEntries - pointer to an allocated Sl_WlanNetworkEntry_t. - the number of array items should match "Count" - sec_type: SL_SCAN_SEC_TYPE_OPEN, SL_SCAN_SEC_TYPE_WEP, SL_SCAN_SEC_TYPE_WPA or SL_SCAN_SEC_TYPE_WPA2 - - - \return Number of valid networks list items - - \sa - \note belongs to \ref ext_api - \warning This command do not initiate any active scanning action - \par Example: - \code An example of fetching max 10 results: - - Sl_WlanNetworkEntry_t netEntries[10]; - int16_t resultsCount = sl_WlanGetNetworkList(0,10,&netEntries[0]); - for(i=0; i< resultsCount; i++) - { - printf("%s\n",netEntries[i].ssid); - } - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_WlanGetNetworkList) - int16_t sl_WlanGetNetworkList(uint8_t Index, uint8_t Count, Sl_WlanNetworkEntry_t *pEntries); -#endif - - /*! - \brief Start collecting wlan RX statistics, for unlimited time. - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_WlanRxStatStop sl_WlanRxStatGet - \note belongs to \ref ext_api - \warning This API is deprecated and should be removed for next release - \par Example: - \code Getting wlan RX statistics: - - void RxStatCollectTwice() - { - SlGetRxStatResponse_t rxStat; - int16_t rawSocket; - int8_t DataFrame[200]; - struct SlTimeval_t timeval; - timeval.tv_sec = 0; // Seconds - timeval.tv_usec = 20000; // Microseconds. 10000 microseconds resolution - - sl_WlanRxStatStart(); // set statistics mode - - rawSocket = sl_Socket(SL_AF_RF, SL_SOCK_RAW, eChannel); - // set timeout - in case we have no activity for the specified channel - sl_SetSockOpt(rawSocket,SL_SOL_SOCKET,SL_SO_RCVTIMEO, &timeval, sizeof(timeval)); // Enable receive timeout - status = sl_Recv(rawSocket, DataFrame, sizeof(DataFrame), 0); - - Sleep(1000); // sleep for 1 sec - sl_WlanRxStatGet(&rxStat,0); // statistics has been cleared upon read - Sleep(1000); // sleep for 1 sec - sl_WlanRxStatGet(&rxStat,0); - - } - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_WlanRxStatStart) - int16_t sl_WlanRxStatStart(void); -#endif - - - /*! - \brief Stop collecting wlan RX statistic, (if previous called sl_WlanRxStatStart) - - \return On success, zero is returned. On error, -1 is returned - - \sa sl_WlanRxStatStart sl_WlanRxStatGet - \note belongs to \ref ext_api - \warning This API is deprecated and should be removed for next release - */ -#if _SL_INCLUDE_FUNC(sl_WlanRxStatStop) - int16_t sl_WlanRxStatStop(void); -#endif - - - /*! - \brief Get wlan RX statistics. upon calling this command, the statistics counters will be cleared. - - \param[in] Flags should be 0 ( not applicable right now, will be added the future ) - \param[in] pRxStat a pointer to SlGetRxStatResponse_t filled with Rx statistics results - \return On success, zero is returned. On error, -1 is returned - - \sa sl_WlanRxStatStart sl_WlanRxStatStop - \note belongs to \ref ext_api - \warning - */ -#if _SL_INCLUDE_FUNC(sl_WlanRxStatGet) - int16_t sl_WlanRxStatGet(SlGetRxStatResponse_t *pRxStat,uint32_t Flags); -#endif - - - /*! - \brief Stop Smart Config procedure. Once Smart Config will be stopped, - Asynchronous event will be received - SL_OPCODE_WLAN_SMART_CONFIG_STOP_ASYNC_RESPONSE. - - \param[in] none - \param[out] none - - \return 0 - if Stop Smart Config is about to be executed without errors. - - \sa sl_WlanSmartConfigStart - \note belongs to \ref ext_api - \warning This API is deprecated and should be removed for next release - - */ -#if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStop) - int16_t sl_WlanSmartConfigStop(void); -#endif - - /*! - \brief Start Smart Config procedure - \par - The target of the procedure is to let the \n - device to gain the network parameters: SSID and Password (if network is secured) \n - and to connect to it once located in the network range. \n - An external application should be used on a device connected to any mobile network. \n - The external application will transmit over the air the network parameters in secured manner.\n - The Password may be decrypted using a Key. \n - The decryption method may be decided in the command or embedded in the Flash. \n - The procedure can be activated for 1-3 group ID in the range of BIT_0 - BIT_15 where the default group ID id 0 (BIT_0) \n - Once Smart Config has ended successfully, Asynchronous event will be received - \n - SL_OPCODE_WLAN_SMART_CONFIG_START_ASYNC_RESPONSE. \n - The Event will hold the SSID and an extra field that might have been delivered as well (i.e. - device name) - - \param[in] groupIdBitmask - each bit represent a group ID that should be searched. - The Default group ID id BIT_0. 2 more group can be searched - in addition. The range is BIT_0 - BIT_15. - \param[in] chiper - 0: check in flash, 1 - AES, 0xFF - do not check in flash - \param[in] publicKeyLen - public key len (used for the default group ID - BIT_0) - \param[in] group1KeyLen - group ID1 length - \param[in] group2KeyLen - group ID2 length - \param[in] publicKey - public key (used for the default group ID - BIT_0) - \param[in] group1Key - group ID1 key - \param[in] group2Key - group ID2 key - - \param[out] none - - \return 0 - if Smart Config started successfully. - - \sa sl_WlanSmartConfigStop - \note belongs to \ref ext_api - \warning - \par - \code An example of starting smart Config on group ID's 0 + 1 + 2 - - sl_WlanSmartConfigStart(7, //group ID's (BIT_0 | BIT_1 | BIT_2) - 1, //decrypt key by AES method - 16, //decryption key length for group ID0 - 16, //decryption key length for group ID1 - 16, //decryption key length for group ID2 - "Key0Key0Key0Key0", //decryption key for group ID0 - "Key1Key1Key1Key1", //decryption key for group ID1 - "Key2Key2Key2Key2" //decryption key for group ID2 - ); - \endcode - */ -#if _SL_INCLUDE_FUNC(sl_WlanSmartConfigStart) - int16_t 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* publicKey, - const uint8_t* group1Key, - const uint8_t* group2Key); -#endif - - - /*! - \brief Wlan set mode - - Setting WLAN mode - - \param[in] mode - WLAN mode to start the CC31xx device. Possible options are: - - ROLE_STA - for WLAN station mode - - ROLE_AP - for WLAN AP mode - - ROLE_P2P -for WLAN P2P mode - \return 0 - if mode was set correctly - \sa sl_Start sl_Stop - \note belongs to \ref ext_api - \warning After setting the mode the system must be restarted for activating the new mode - \par Example: - \code - //Switch from any role to STA: - sl_WlanSetMode(ROLE_STA); - sl_Stop(0); - sl_Start(NULL,NULL,NULL); - \endcode - - */ -#if _SL_INCLUDE_FUNC(sl_WlanSetMode) - int16_t sl_WlanSetMode(const uint8_t mode); -#endif - - - /*! - \brief Internal function for setting WLAN configurations - - \return On success, zero is returned. On error one of the following error codes returned: - - CONF_ERROR (-1) - - CONF_NVMEM_ACCESS_FAILED (-2) - - CONF_OLD_FILE_VERSION (-3) - - CONF_ERROR_NO_SUCH_COUNTRY_CODE (-4) - - - \param[in] ConfigId - configuration id - - <b>SL_WLAN_CFG_AP_ID</b> - - <b>SL_WLAN_CFG_GENERAL_PARAM_ID</b> - - <b>SL_WLAN_CFG_P2P_PARAM_ID</b> - - \param[in] ConfigOpt - configurations option - - <b>SL_WLAN_CFG_AP_ID</b> - - <b>WLAN_AP_OPT_SSID</b> \n - Set SSID for AP mode. \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>WLAN_AP_OPT_CHANNEL</b> \n - Set channel for AP mode. \n - The channel is dependant on the country code which is set. i.e. for "US" the channel should be in the range of [1-11] \n - This option takes <b>uint8_t</b> as a parameter - - <b>WLAN_AP_OPT_HIDDEN_SSID</b> \n - Set Hidden SSID Mode for AP mode.Hidden options: \n - 0: disabled \n - 1: Send empty (length=0) SSID in beacon and ignore probe request for broadcast SSID \n - 2: Clear SSID (ASCII 0), but keep the original length (this may be required with some \n - clients that do not support empty SSID) and ignore probe requests for broadcast SSID \n - This option takes <b>uint8_t</b> as a parameter - - <b>WLAN_AP_OPT_SECURITY_TYPE</b> \n - Set Security type for AP mode. Security options are: - - Open security: SL_SEC_TYPE_OPEN - - WEP security: SL_SEC_TYPE_WEP - - WPA security: SL_SEC_TYPE_WPA_WPA2 \n - This option takes <b>uint8_t</b> pointer as a parameter - - <b>WLAN_AP_OPT_PASSWORD</b> \n - Set Password for for AP mode (for WEP or for WPA): \n - Password - for WPA: 8 - 63 characters \n - for WEP: 5 / 13 characters (ascii) \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_WLAN_CFG_GENERAL_PARAM_ID</b> - - <b>WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE</b> \n - Set Country Code for AP mode \n - This options takes <b>uint8_t</b> 2 bytes buffer as parameter - - <b>WLAN_GENERAL_PARAM_OPT_STA_TX_POWER</b> \n - Set STA mode Tx power level \n - Number between 0-15, as dB offset from max power (0 will set MAX power) \n - This options takes <b>uint8_t</b> as parameter - - <b>WLAN_GENERAL_PARAM_OPT_AP_TX_POWER</b> - Set AP mode Tx power level \n - Number between 0-15, as dB offset from max power (0 will set MAX power) \n - This options takes <b>uint8_t</b> as parameter - - <b>WLAN_GENERAL_PARAM_OPT_INFO_ELEMENT</b> - Set Info Element for AP mode. \n - The Application can set up to MAX_PRIVATE_INFO_ELEMENTS_SUPPROTED info elements per Role (AP / P2P GO). \n - To delete an info element use the relevant index and length = 0. \n - The Application can set up to MAX_PRIVATE_INFO_ELEMENTS_SUPPROTED to the same role. \n - However, for AP - no more than INFO_ELEMENT_MAX_TOTAL_LENGTH_AP bytes can be stored for all info elements. \n - For P2P GO - no more than INFO_ELEMENT_MAX_TOTAL_LENGTH_P2P_GO bytes can be stored for all info elements. \n - This option takes sl_protocol_WlanSetInfoElement_t as parameter - - <b>SL_WLAN_CFG_P2P_PARAM_ID</b> - - <b>WLAN_P2P_OPT_DEV_TYPE</b> \n - Set P2P Device type.Maximum length of 17 characters. Device type is published under P2P I.E, \n - allows to make devices easier to recognize. \n - In case no device type is set, the default type is "1-0050F204-1" \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>WLAN_P2P_OPT_CHANNEL_N_REGS</b> \n - Set P2P Channels. \n - listen channel (either 1/6/11 for 2.4GHz) \n - listen regulatory class (81 for 2.4GHz) \n - oper channel (either 1/6/11 for 2.4GHz) \n - oper regulatory class (81 for 2.4GHz) \n - listen channel and regulatory class will determine the device listen channel during p2p find listen phase \n - oper channel and regulatory class will determine the operating channel preferred by this device (in case it is group owner this will be the operating channel) \n - channels should be one of the social channels (1/6/11). In case no listen/oper channel selected, a random 1/6/11 will be selected. - This option takes pointer to <b>uint8_t[4]</b> as parameter - - \param[in] ConfigLen - configurations len - - \param[in] pValues - configurations values - - \sa - \note - \warning - \par Examples: - \par - <b> WLAN_AP_OPT_SSID: </b> - \code - uint8_t str[33]; - memset(str, 0, 33); - memcpy(str, ssid, len); // ssid string of 32 characters - sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(ssid), str); - \endcode - \par - <b> WLAN_AP_OPT_CHANNEL: </b> - \code - uint8_t val = channel; - sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_CHANNEL, 1, (uint8_t *)&val); - \endcode - \par - <b> WLAN_AP_OPT_HIDDEN_SSID: </b> - \code - uint8_t val = hidden; - sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_HIDDEN_SSID, 1, (uint8_t *)&val); - \endcode - \par - <b> WLAN_AP_OPT_SECURITY_TYPE: </b> - \code - uint8_t val = SL_SEC_TYPE_WPA_WPA2; - sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (uint8_t *)&val); - \endcode - \par - <b> WLAN_AP_OPT_PASSWORD: </b> - \code - uint8_t str[65]; - uint16_t len = strlen(password); - memset(str, 0, 65); - memcpy(str, password, len); - sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, len, (uint8_t *)str); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_STA_TX_POWER: </b> - \code - uint8_t stapower=(uint8_t)power; - sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER,1,(uint8_t *)&stapower); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE: </b> - \code - uint8_t* str = (uint8_t *) country; // string of 2 characters. i.e. - "US" - sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, 2, str); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_AP_TX_POWER: </b> - \code - uint8_t appower=(uint8_t)power; - sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_AP_TX_POWER,1,(uint8_t *)&appower); - \endcode - \par - <b> WLAN_P2P_OPT_DEV_TYPE: </b> - \code - uint8_t str[17]; - uint16_t len = strlen(device_type); - memset(str, 0, 17); - memcpy(str, device_type, len); - sl_WlanSet(SL_WLAN_CFG_P2P_PARAM_ID, WLAN_P2P_OPT_DEV_TYPE, len, str); - \endcode - \par - <b> WLAN_P2P_OPT_CHANNEL_N_REGS: </b> - \code - uint8_t str[4]; - str[0] = (uint8_t)11; // listen channel - str[1] = (uint8_t)81; // listen regulatory class - str[2] = (uint8_t)6; // oper channel - str[3] = (uint8_t)81; // oper regulatory class - sl_WlanSet(SL_WLAN_CFG_P2P_PARAM_ID, WLAN_P2P_OPT_CHANNEL_N_REGS, 4, str); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_INFO_ELEMENT: </b> - \code - sl_protocol_WlanSetInfoElement_t infoele; - infoele.index = Index; // Index of the info element. range: 0 - MAX_PRIVATE_INFO_ELEMENTS_SUPPROTED - infoele.role = Role; // INFO_ELEMENT_AP_ROLE (0) or INFO_ELEMENT_P2P_GO_ROLE (1) - infoele.ie.id = Id; // Info element ID. if INFO_ELEMENT_DEFAULT_ID (0) is set, ID will be set to 221. - // Organization unique ID. If all 3 bytes are zero - it will be replaced with 08,00,28. - infoele.ie.oui[0] = Oui0; // Organization unique ID first Byte - infoele.ie.oui[1] = Oui1; // Organization unique ID second Byte - infoele.ie.oui[2] = Oui2; // Organization unique ID third Byte - infoele.ie.length = Len; // Length of the info element. must be smaller than 253 bytes - memset(infoele.ie.data, 0, INFO_ELEMENT_MAX_SIZE); - if ( Len <= INFO_ELEMENT_MAX_SIZE ) - { - memcpy(infoele.ie.data, IE, Len); // Info element. length of the info element is [0-252] - sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID,WLAN_GENERAL_PARAM_OPT_INFO_ELEMENT,sizeof(sl_protocol_WlanSetInfoElement_t),(uint8_t* ) &infoele); - } - sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID,WLAN_GENERAL_PARAM_OPT_INFO_ELEMENT,sizeof(sl_protocol_WlanSetInfoElement_t),(uint8_t* ) &infoele); - \endcode - - */ -#if _SL_INCLUDE_FUNC(sl_WlanSet) - int16_t sl_WlanSet(uint16_t ConfigId ,uint16_t ConfigOpt,uint16_t ConfigLen, uint8_t *pValues); -#endif - - /*! - \brief Internal function for getting WLAN configurations - - \return On success, zero is returned. On error, -1 is - returned - - \param[in] ConfigId - configuration id - - <b>SL_WLAN_CFG_AP_ID</b> - - <b>SL_WLAN_CFG_GENERAL_PARAM_ID</b> - - <b>SL_WLAN_CFG_P2P_PARAM_ID</b> - - \param[out] pConfigOpt - get configurations option - - <b>SL_WLAN_CFG_AP_ID</b> - - <b>WLAN_AP_OPT_SSID</b> \n - Get SSID for AP mode. \n - Get up to 32 characters of SSID \n - This options takes <b>uint8_t</b> as parameter - - <b>WLAN_AP_OPT_CHANNEL</b> \n - Get channel for AP mode. \n - This option takes <b>uint8_t</b> as a parameter - - <b>WLAN_AP_OPT_HIDDEN_SSID</b> \n - Get Hidden SSID Mode for AP mode.Hidden options: \n - 0: disabled \n - 1: Send empty (length=0) SSID in beacon and ignore probe request for broadcast SSID \n - 2: Clear SSID (ASCII 0), but keep the original length (this may be required with some \n - clients that do not support empty SSID) and ignore probe requests for broadcast SSID \n - This option takes <b>uint8_t</b> as a parameter - - <b>WLAN_AP_OPT_SECURITY_TYPE</b> \n - Get Security type for AP mode. Security options are: - - Open security: SL_SEC_TYPE_OPEN - - WEP security: SL_SEC_TYPE_WEP - - WPA security: SL_SEC_TYPE_WPA_WPA2 \n - This option takes <b>uint8_t</b> as a parameter - - <b>WLAN_AP_OPT_PASSWORD</b> \n - Get Password for for AP mode (for WEP or for WPA): \n - Returns password - string, fills up to 64 characters. \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>SL_WLAN_CFG_GENERAL_PARAM_ID</b> - - <b> WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS </b> \n - Get scan parameters. - This option uses slWlanScanParamCommand_t as parameter - - <b>WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE</b> \n - Get Country Code for AP mode \n - This options takes <b>uint8_t</b> buffer as parameter - - <b>WLAN_GENERAL_PARAM_OPT_STA_TX_POWER</b> \n - Get STA mode Tx power level \n - Number between 0-15, as dB offset from max power (0 indicates MAX power) \n - This options takes <b>uint8_t</b> as parameter - - <b>WLAN_GENERAL_PARAM_OPT_AP_TX_POWER</b> - Get AP mode Tx power level \n - Number between 0-15, as dB offset from max power (0 indicates MAX power) \n - This options takes <b>uint8_t</b> as parameter - - <b>SL_WLAN_CFG_P2P_PARAM_ID</b> - - <b>WLAN_P2P_OPT_CHANNEL_N_REGS</b> \n - Get P2P Channels. \n - listen channel (either 1/6/11 for 2.4GHz) \n - listen regulatory class (81 for 2.4GHz) \n - oper channel (either 1/6/11 for 2.4GHz) \n - oper regulatory class (81 for 2.4GHz) \n - listen channel and regulatory class will determine the device listen channel during p2p find listen phase \n - oper channel and regulatory class will determine the operating channel preferred by this device (in case it is group owner this will be the operating channel) \n - channels should be one of the social channels (1/6/11). In case no listen/oper channel selected, a random 1/6/11 will be selected. \n - This option takes pointer to <b>uint8_t[4]</b> as parameter - - \param[out] pConfigLen - The length of the allocated memory as input, when the - function complete, the value of this parameter would be - the len that actually read from the device. - If the device return length that is longer from the input - value, the function will cut the end of the returned structure - and will return SL_ESMALLBUF. - - - \param[out] pValues - get configurations values - - \sa sl_WlanSet - - \note - - \warning - - \par Examples: - \par - <b> WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS: </b> - \code - slWlanScanParamCommand_t ScanParamConfig; - uint16_t Option = WLAN_GENERAL_PARAM_OPT_SCAN_PARAMS; - uint16_t OptionLen = sizeof(slWlanScanParamCommand_t); - sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID ,&Option,&OptionLen,(uint8_t *)&ScanParamConfig); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_AP_TX_POWER: </b> - \code - int16_t TXPower = 0; - uint16_t Option = WLAN_GENERAL_PARAM_OPT_AP_TX_POWER; - uint16_t OptionLen = sizeof(int16_t); - sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID ,&Option,&OptionLen,(uint8_t *)&TXPower); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_STA_TX_POWER: </b> - \code - int16_t TXPower = 0; - uint16_t Option = WLAN_GENERAL_PARAM_OPT_STA_TX_POWER; - uint16_t OptionLen = sizeof(int16_t); - - sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID ,&Option,&OptionLen,(uint8_t *)&TXPower); - \endcode - \par - <b> WLAN_P2P_OPT_DEV_TYPE: </b> - \code - int8_t device_type[18]; - uint16_t len = 18; - uint16_t config_opt = WLAN_P2P_OPT_DEV_TYPE; - sl_WlanGet(SL_WLAN_CFG_P2P_PARAM_ID, &config_opt , &len, (uint8_t* )device_type); - \endcode - \par - <b> WLAN_AP_OPT_SSID: </b> - \code - int8_t ssid[32]; - uint16_t len = 32; - uint16_t config_opt = WLAN_AP_OPT_SSID; - sl_WlanGet(SL_WLAN_CFG_AP_ID, &config_opt , &len, (uint8_t* )ssid); - \endcode - \par - <b> WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE: </b> - \code - int8_t country[3]; - uint16_t len = 3; - uint16_t config_opt = WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE; - sl_WlanGet(SL_WLAN_CFG_GENERAL_PARAM_ID, &config_opt, &len, (uint8_t* )country); - \endcode - \par - <b> WLAN_AP_OPT_CHANNEL: </b> - \code - int8_t channel; - uint16_t len = 1; - uint16_t config_opt = WLAN_AP_OPT_CHANNEL; - sl_WlanGet(SL_WLAN_CFG_AP_ID, &config_opt, &len, (uint8_t* )&channel); - \endcode - \par - <b> WLAN_AP_OPT_HIDDEN_SSID: </b> - \code - uint8_t hidden; - uint16_t len = 1; - uint16_t config_opt = WLAN_AP_OPT_HIDDEN_SSID; - sl_WlanGet(SL_WLAN_CFG_AP_ID, &config_opt, &len, (uint8_t* )&hidden); - \endcode - \par - <b> WLAN_AP_OPT_SECURITY_TYPE: </b> - \code - uint8_t sec_type; - uint16_t len = 1; - uint16_t config_opt = WLAN_AP_OPT_SECURITY_TYPE; - sl_WlanGet(SL_WLAN_CFG_AP_ID, &config_opt, &len, (uint8_t* )&sec_type); - \endcode - \par - <b> WLAN_AP_OPT_PASSWORD: </b> - \code - uint8_t password[64]; - uint16_t len = 64; - memset(password,0,64); - uint16_t config_opt = WLAN_AP_OPT_PASSWORD; - sl_WlanGet(SL_WLAN_CFG_AP_ID, &config_opt, &len, (uint8_t* )password); - - \endcode - \par - <b> WLAN_P2P_OPT_CHANNEL_N_REGS: </b> - \code - uint16_t listen_channel,listen_reg,oper_channel,oper_reg; - uint16_t len = 4; - uint16_t config_opt = WLAN_P2P_OPT_CHANNEL_N_REGS; - uint8_t channel_n_regs[4]; - sl_WlanGet(SL_WLAN_CFG_P2P_PARAM_ID, &config_opt, &len, (uint8_t* )channel_n_regs); - listen_channel = channel_n_regs[0]; - listen_reg = channel_n_regs[1]; - oper_channel = channel_n_regs[2]; - oper_reg = channel_n_regs[3]; - \endcode - */ - -#if _SL_INCLUDE_FUNC(sl_WlanGet) - int16_t sl_WlanGet(uint16_t ConfigId, uint16_t *pConfigOpt,uint16_t *pConfigLen, uint8_t *pValues); -#endif - -private: - - cc3100_driver &_driver; - cc3100_wlan_rx_filters &_wlan_filters; - - /*! - - Close the Doxygen group. - @} - - */ - -};//class - -}//namespace mbed_cc3100 - -#endif /* __WLAN_H__ */ - -
--- a/simplelink/cc3100_wlan_rx_filters.h Mon Feb 23 21:10:13 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1011 +0,0 @@ -/* - * wlan_rx_filters.h - 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. - * -*/ - -#ifndef RX_FILTERS_PREPROCESSOR_CLI_IF_H_ -#define RX_FILTERS_PREPROCESSOR_CLI_IF_H_ - - -/*****************************************************************************/ -/* Include files */ -/*****************************************************************************/ -#include "cc3100_simplelink.h" -#include "cc3100_driver.h" - -/*****************************************************************************/ -/* Macro declarations */ -/*****************************************************************************/ - -/*! - * \def SL_RX_FILTER_MAX_FILTERS - * The Max number of filters for 64 filters - */ -#define SL_RX_FILTER_MAX_FILTERS 64 - -/*! - * \def SL_RX_FILTER_MAX_PRE_PREPARED_FILTERS_SETS - * The Max number of software filters - */ -#define SL_RX_FILTER_MAX_PRE_PREPARED_FILTERS_SETS (32) -/*! - * \def SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * - */ -#define SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS (2) -/*! - * \def SL_RX_FILTER_NUM_OF_FILTER_PAYLOAD_ARGS - * - */ -#define SL_RX_FILTER_NUM_OF_FILTER_PAYLOAD_ARGS (2) -/*! - * \def SL_RX_FILTER_NUM_OF_FILTER_PAYLOAD_ARGS - * - */ -#define SL_RX_FILTER_NUM_OF_COMBINATION_TYPE_ARGS (2) -/*! - * \def SL_RX_FILTER_LENGTH_OF_REGX_PATTERN_LENGTH - * - */ -#define SL_RX_FILTER_LENGTH_OF_REGX_PATTERN_LENGTH (32) - - -/* List of possible error numbers */ -#define RXFL_OK (0) /* O.K */ -#define RXFL_OUTPUT_OR_INPUT_BUFFER_LENGTH_TOO_SMALL (76) /* ! The output buffer length is smaller than required for that operation */ -#define RXFL_DEPENDENT_FILTER_SOFTWARE_FILTER_NOT_FIT (75) /* Node filter can't be child of software filter and vice_versa */ -#define RXFL_DEPENDENCY_IS_NOT_PERSISTENT (74) /* Dependency filter is not persistent */ -#define RXFL_SYSTEM_STATE_NOT_SUPPORTED_FOR_THIS_FILTER (72) /* System state is not supported */ -#define RXFL_TRIGGER_USE_REG5_TO_REG8 (71) /* Only counters 5 - 8 are allowed, for Tigger */ -#define RXFL_TRIGGER_USE_REG1_TO_REG4 (70) /* Only counters 1 - 4 are allowed, for trigger */ -#define RXFL_ACTION_USE_REG5_TO_REG8 (69) /* Only counters 5 - 8 are allowed, for action */ -#define RXFL_ACTION_USE_REG1_TO_REG4 (68) /* Only counters 1 - 4 are allowed, for action */ -#define RXFL_FIELD_SUPPORT_ONLY_EQUAL_AND_NOTEQUAL (67) /* Rule compare function Id is out of range */ -#define RXFL_WRONG_MULTICAST_BROADCAST_ADDRESS (66) /* The address should be of type mutlicast or broadcast */ -#define RXFL_THE_FILTER_IS_NOT_OF_HEADER_TYPE (65) /* The filter should be of header type */ -#define RXFL_WRONG_COMPARE_FUNC_FOR_BROADCAST_ADDRESS (64) /* The compare funcion is not suitable for broadcast address */ -#define RXFL_WRONG_MULTICAST_ADDRESS (63) /* The address should be of muticast type */ -#define RXFL_DEPENDENT_FILTER_IS_NOT_PERSISTENT (62) /* The dependency filter is not persistent */ -#define RXFL_DEPENDENT_FILTER_IS_NOT_ENABLED (61) /* The dependency filter is not enabled */ -#define RXFL_FILTER_HAS_CHILDS (60) /* The filter has childs and can't be removed */ -#define RXFL_CHILD_IS_ENABLED (59) /* Can't disable filter while the child is enabled */ -#define RXFL_DEPENDENCY_IS_DISABLED (58) /* Can't enable filetr in case its depndency filter is disabled */ -#define RXFL_NUMBER_OF_CONNECTION_POINTS_EXCEEDED (52) /* Number of connection points exceeded */ -#define RXFL_DEPENDENT_FILTER_DEPENDENCY_ACTION_IS_DROP (51) /* The dependent filter has Drop action, thus the filter can't be created */ -#define RXFL_FILTER_DO_NOT_EXISTS (50) /* The filter doesn't exists */ -#define RXFL_DEPEDENCY_NOT_ON_THE_SAME_LAYER (49) /* The filter and its dependency must be on the same layer */ -#define RXFL_NUMBER_OF_ARGS_EXCEEDED (48) /* Number of arguments excceded */ -#define RXFL_ACTION_NO_REG_NUMBER (47) /* Action require counter number */ -#define RXFL_DEPENDENT_FILTER_LAYER_DO_NOT_FIT (46) /* the filter and its dependency should be from the same layer */ -#define RXFL_DEPENDENT_FILTER_SYSTEM_STATE_DO_NOT_FIT (45) /* The filter and its dependency system state don't fit */ -#define RXFL_DEPENDENT_FILTER_DO_NOT_EXIST_2 (44) /* The parent filter don't exist */ -#define RXFL_DEPENDENT_FILTER_DO_NOT_EXIST_1 (43) /* The parent filter is null */ -#define RXFL_RULE_HEADER_ACTION_TYPE_NOT_SUPPORTED (42) /* The action type is not supported */ -#define RXFL_RULE_HEADER_TRIGGER_COMPARE_FUNC_OUT_OF_RANGE (41) /* The Trigger comparision function is out of range */ -#define RXFL_RULE_HEADER_TRIGGER_OUT_OF_RANGE (40) /* The Trigger is out of range */ -#define RXFL_RULE_HEADER_COMPARE_FUNC_OUT_OF_RANGE (39) /* The rule compare function is out of range */ -#define RXFL_FRAME_TYPE_NOT_SUPPORTED (38) /* ASCII frame type string is illegal */ -#define RXFL_RULE_FIELD_ID_NOT_SUPPORTED (37) /* Rule field ID is out of range */ -#define RXFL_RULE_HEADER_FIELD_ID_ASCII_NOT_SUPPORTED (36) /* This ASCII field ID is not supported */ -#define RXFL_RULE_HEADER_NOT_SUPPORTED (35) /* The header rule is not supported on current release */ -#define RXFL_RULE_HEADER_OUT_OF_RANGE (34) /* The header rule is out of range */ -#define RXFL_RULE_HEADER_COMBINATION_OPERATOR_OUT_OF_RANGE (33) /* Combination function Id is out of ramge */ -#define RXFL_RULE_HEADER_FIELD_ID_OUT_OF_RANGE (32) /* rule field Id is out of range */ -#define RXFL_UPDATE_NOT_SUPPORTED (31) /* Update not supported */ -#define RXFL_NO_FILTERS_ARE_DEFINED (24) /* No filters are defined in the system */ -#define RXFL_NUMBER_OF_FILTER_EXCEEDED (23) /* Number of max filters excceded */ - - -/******************************************************************************/ -/* Type declarations */ -/******************************************************************************/ - -/*! - - - * \typedef SlrxFilterID_t - * Unique filter ID which is allocated by the system , negative number means error - */ -typedef int8_t SlrxFilterID_t; - - -/*! - * \typedef SlrxFilterCompareMask_t - * The mask is used for the rule comparison function - */ -typedef uint8_t SlrxFilterCompareMask_t; - -/*! - * \typedef SlrxFilterIdMask_t - * Representation of filters Id as a bit field - * The bit field is used to declare which filters are involved - * in operation. Number of filter can be up to 128 filters. i.e. 128 bits are needed. - * On the current release, up to 64 filters can be defined. - */ -typedef uint8_t SlrxFilterIdMask_t[128/8]; - -/*! - * \typedef SlrxFilterPrePreparedFilters_t - * Describes the supported software filter sets, - */ -typedef uint8_t SlrxFilterPrePreparedFilters_t; -#define SL_ARP_AUTO_REPLY_PRE_PREPARED_FILTERS (0) -#define SL_MULTICASTSIPV4_DROP_PREPREPARED_FILTERS (1) -#define SL_MULTICASTSIPV6_DROP_PREPREPARED_FILTERS (2) -#define SL_MULTICASTSWIFI_DROP_PREPREPARED_FILTERS (3) - - - -/*! - * \typedef SlrxFilterPrePreparedFiltersMask_t - * Describes the supported software filter sets, - * each bit represents different software filter set - * The filter sets are defined at SlrxFilterPrePreparedFilters_t - */ -typedef uint8_t SlrxFilterPrePreparedFiltersMask_t[SL_RX_FILTER_MAX_PRE_PREPARED_FILTERS_SETS/8]; - - -/*! \typedef SlrxFilterRegxPattern_t - * The struct contains the regular expression pattern which is used in case of payload rule. - * Not supported in the current release - */ -typedef struct SlrxFilterRegxPattern_t { - uint8_t x[SL_RX_FILTER_LENGTH_OF_REGX_PATTERN_LENGTH]; -} SlrxFilterRegxPattern_t; - - -/*! \typedef SlrxFilterAsciiArg_t - * The buffer is used to provide container for ASCII argument, which may be used in case of HEADER rule. - * example for ASCII argument can be : IP = 256.0.67.1 - */ -typedef uint8_t SlrxFilterAsciiArg_t; - - -/*! \typedef SlrxFilterBinaryArg_t - * The buffer provides container for binary argument, which may be used in case of HEADER rule - */ -typedef uint8_t SlrxFilterBinaryArg_t ; - - -/*! \typedef SlrxFilterActionArg_t - * Provides container for the filter action argument. - * for example: in case action is to send automatic response , the argument is the template to be used for the automatic response. - * - * - */ -typedef uint8_t SlrxFilterActionArg_t ; - - - -/*! \typedef SlrxFilterOffset_t - * The offset relative to the packet payload start location. - * Not supported on current release - */ -typedef uint32_t SlrxFilterOffset_t; - - - -/*! \typedef SlrxFilterRuleType_t - * Enumerates the different filter types. - * On the current release only HEADER and COMBINATION are supported. - */ -typedef uint8_t SlrxFilterRuleType_t; -/* possible values for SlrxFilterRuleType_t */ -#define HEADER (0) -#define COMBINATION (1) -#define EXACT_PATTERN (2) -#define LIKELIHOOD_PATTERN (3) -#define ALWAYS_TRUE (4) -#define NUM_OF_FILTER_TYPES (5) - - -/*! \typedef SlrxFilterFlags_t - * Bit field which sets the behaviour of the RX filter - * - */ - -#define RX_FILTER_BINARY (0x1) -#define RX_FILTER_PERSISTENT (0x8) -#define RX_FILTER_ENABLE (0x10) - -typedef union SlrxFilterFlags_t { - - /* struct - { */ - /*! - * The filter argument can be set as binary argument or ASCII arguments. - * When the bit is on the argument are binary. - */ - /* uint8_t Binary: 1; */ - /*! - * - */ - /* uint8_t AutoSort : 1; */ - /*! - * - */ - /* uint8_t AutoFaultDetect : 1; */ - /*! - * When the bit is on it means the the node is enabled . - */ - /* uint8_t Enabled : 1; */ - /* uint8_t padding : 3; */ - /* - };*/ - - uint8_t IntRepresentation; - -} SlrxFilterFlags_t; - -/*! \typedef SlrxFilterCompareFunction_t - * Used as comparison function for the header type arguments - * - */ -typedef uint8_t SlrxFilterCompareFunction_t; -/* Possible values for SlrxFilterCompareFunction_t */ -#define COMPARE_FUNC_IN_BETWEEN (0) -#define COMPARE_FUNC_EQUAL (1) -#define COMPARE_FUNC_NOT_EQUAL_TO (2) -#define COMPARE_FUNC_NOT_IN_BETWEEN (3) -#define COMPARE_FUNC_NUM_OF_FILTER_COMPARE_FUNC (4) - -/*! \typedef SlrxFilterCompareFunction_t - * Used as comparison function for the header type arguments - * - */ -typedef uint8_t SlrxTriggerCompareFunction_t; -/* Possible values for SlrxTriggerCompareFunction_t */ -#define TRIGGER_COMPARE_FUNC_EQUAL (0) -/* arg1 == protocolVal ,not supported in current release */ -#define TRIGGER_COMPARE_FUNC_NOT_EQUAL_TO (1) -/* arg1 == protocolVal */ -#define TRIGGER_COMPARE_FUNC_SMALLER_THAN (2) -/* arg1 == protocolVal */ -#define TRIGGER_COMPARE_FUNC_BIGGER_THAN (3) -/* definition */ -#define TRIGGER_COMPARE_FUNC_NUM_OF_FILTER_COMPARE_FUNC (4) - - -/*! \typedef SlrxFilterHdrField_t - * Provides list of possible header types which may be defined as part of the rule - * - */ -typedef uint8_t SlrxFilterHdrField_t; -/* Possible values for SlrxFilterHdrField_t */ -#define NULL_FIELD_ID_TYPE (0) -/* 802.11 control\data\management */ -#define FRAME_TYPE_FIELD (1) -/* 802.11 beacon\probe\.. */ -#define FRAME_SUBTYPE_FIELD (2) -/* 802.11 bssid type */ -#define BSSID_FIELD (3) -/* */ -#define MAC_SRC_ADDRESS_FIELD (4) -/* */ -#define MAC_DST_ADDRESS_FIELD (5) -/* */ -#define FRAME_LENGTH_FIELD (6) -/* */ -#define PROTOCOL_TYPE_FIELD (7) -/* */ -#define IP_VERSION_FIELD (8) -/* TCP / UDP */ -#define IP_PROTOCOL_FIELD (9) -/* */ -#define IPV4_SRC_ADRRESS_FIELD (10) -/* */ -#define IPV4_DST_ADDRESS_FIELD (11) -/* */ -#define IPV6_SRC_ADRRESS_FIELD (12) -/* */ -#define IPV6_DST_ADDRESS_FIELD (13) -/* */ -#define SRC_PORT_FIELD (14) -/* */ -#define DST_PORT_FIELD (15) -/* Definition */ -#define NUM_OF_FIELD_NAME_FIELD (16) - -/*! \union SlrxFilterHeaderArg_t - * The structure holds the header ARGS which are used in case of HDR rule. - */ -/* -- 36 bytes */ -typedef union SlrxFilterHeaderArg_t { - /*----------------------------- Large size ---------------------------------*/ - /*! buffer for binary arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * example : IPV6 16 bytes, 39 characters - * ipv6 Ascii address: 2001:0db8:3c4d:0015:0000:0000:abcd:ef12 - */ - - SlrxFilterBinaryArg_t RxFilterDB16BytesRuleArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][16 ]; /* Binary Values for comparition */ - /*! buffer for ASCII arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * example : IPV6 16 bytes, 39 characters - * ipv6 Ascii address: 2001:0db8:3c4d:0015:0000:0000:abcd:ef12 - * Ascii format for ipV6 is not supported - */ - /*----------------------------- Medium size ---------------------------------*/ - /*! buffer for binary arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * MAC address: 6 bytes, 17 chars - */ - SlrxFilterBinaryArg_t RxFilterDB6BytesRuleArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][6]; /* Binary Values for comparition */ - /*! - * ! buffer for ASCII arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * IP address: 4 bytes, 15 chars - * 2 bytes are added for padding - */ - SlrxFilterAsciiArg_t RxFilterDB18BytesAsciiRuleArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][18]; /* Ascii Values for comparison */ - /*----------------------------- Small size ---------------------------------*/ - /*! buffer for binary arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * IP address: 4 bytes, 15 chars - * Port: 2 bytes, chars: 5 chars - */ - SlrxFilterBinaryArg_t RxFilterDB4BytesRuleArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][4]; /* Binary Values for comparison */ - /*! buffer for ASCII arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - * Port: 2 bytes, chars: 5 chars - */ - SlrxFilterAsciiArg_t RxFilterDB5BytesRuleAsciiArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][5]; /* Ascii Values for comparison */ - /*----------------------------- 1 byte size ---------------------------------*/ - /*! buffer for binary arguments, number of argument may be up to SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS - */ - SlrxFilterBinaryArg_t RxFilterDB1BytesRuleArgs[SL_RX_FILTER_NUM_OF_FILTER_HEADER_ARGS][1]; /* Binary Values for comparison */ -} SlrxFilterHeaderArg_t; - - - -/*! \typedef SlrxFilterRuleHeaderArgsAndMask_t - * Structure which defines the Header Args and mask - */ -/* -- 52 bytes */ -typedef struct SlrxFilterRuleHeaderArgsAndMask_t { - /*! Argument for the comparison function */ - /* -- 36 byte */ - SlrxFilterHeaderArg_t RuleHeaderArgs; - - /*! the mask is used in order to enable partial comparison, - * Use the 0xFFFFFFFF in case you don't want to use mask - */ - /* -- 16 bytes */ - SlrxFilterCompareMask_t RuleHeaderArgsMask[16]; - -} SlrxFilterRuleHeaderArgsAndMask_t; - -/*! \typedef SlrxFilterHeaderType_t - * Structure which defines the Header rule - * The header rule defines compare function on the protocol header - * For example destMacAddre is between ( 12:6::78:77, 12:6::78:90 ) - * - */ -/* -- 56 byte */ -typedef struct SlrxFilterHeaderType_t { - /*! see :: SlrxFilterRuleHeaderArgsAndMask_t */ - /* -- 52 bytes */ - SlrxFilterRuleHeaderArgsAndMask_t RuleHeaderArgsAndMask; - - /*! Packet HDR field which will be compared to the argument */ - /* -- 1 byte */ - SlrxFilterHdrField_t RuleHeaderfield; - - /* -- 1 byte */ - /*! type of the comparison function - * see :: SlrxFilterCompareFunction_t - */ - SlrxFilterCompareFunction_t RuleCompareFunc; - - /*! padding */ - /* -- 2 bytes */ - uint8_t RulePadding[2]; - -} SlrxFilterHeaderType_t; - -/*! \typedef SlrxFilterPayloadType_t - * Structure which defines payload rule. - * Not supported on current release. - */ -/* -- 40 byte */ -typedef struct SlrxFilterPayloadType_t { - /*! Not supported on current release */ - /* -- 32 byte */ - SlrxFilterRegxPattern_t RegxPattern; - /*! Not supported on current release */ - /* -- 4 byte */ - SlrxFilterOffset_t LowerOffset; - /*! Not supported on current release */ - /* -- 4 byte */ - SlrxFilterOffset_t UpperOffset; -} SlrxFilterPayloadType_t; - -/*! \typedef SlrxFilterCombinationTypeOperator_t - * Enumerate the optional operators for the combination type - * filterID1 is located in the first arg , filterId2 is the second arg,see ::SlrxFilterCombinationType_t.CombinationFilterId - */ -typedef uint8_t SlrxFilterCombinationTypeOperator_t; -/* Possible values for SlrxFilterCombinationTypeOperator_t */ -/*! !filterID1 */ -#define COMBINED_FUNC_NOT (0) -/*! filterID1 && filterID2 */ -#define COMBINED_FUNC_AND (1) -/*! filterID1 && filterID2 */ -#define COMBINED_FUNC_OR (2) - -/*! \typedef SlrxFilterCombinationType_t - * Defines the structure which define the combination type filter - * The combined filter enable to make operation on one or two filter, - * for example !filterId1 or and(filterId2,filterId3). - * - */ -/* -- 4 byte */ -typedef struct SlrxFilterCombinationType_t { - /* ! combination operator */ - /* -- 1 byte */ - SlrxFilterCombinationTypeOperator_t CombinationTypeOperator; - /* ! filterID, may be one or two depends on the combination operator type */ - /* -- 2 byte */ - SlrxFilterID_t CombinationFilterId[SL_RX_FILTER_NUM_OF_COMBINATION_TYPE_ARGS]; - /* ! Padding */ - /* -- 1 byte */ - uint8_t Padding; -} SlrxFilterCombinationType_t; - - -/*! \typedef SlrxFilterRule_t - * Rule structure composed of behavioral flags and the filter rule definitions - * - */ -/* -- 56 byte */ -typedef union SlrxFilterRule_t { - /* ! Header type rule , see explanation on the ::SlrxFilterHeaderType_t structure */ - /* -- 56 byte */ - SlrxFilterHeaderType_t HeaderType; - /* ! Payload rule, not supported in current release */ - /* -- 40 byte */ - SlrxFilterPayloadType_t PayLoadHeaderType; /* future for exact pattern or like hood pattern */ - /* ! Combined type rule , see explanation in ::SlrxFilterCombinationType_t structure */ - /* -- 4 byte */ - SlrxFilterCombinationType_t CombinationType; -} SlrxFilterRule_t; - -/*! \typedef SlrxFilterTriggerRoles_t - * Bit field which represents the roleId possible values - * In the current release only Station/AP roles are supported. - */ -#define RX_FILTER_ROLE_AP (1) -#define RX_FILTER_ROLE_STA (2) -#define RX_FILTER_ROLE_PROMISCUOUS (4) -#define RX_FILTER_ROLE_NULL (0) - -typedef union SlrxFilterTriggerRoles_t { - /* struct */ - /* { */ - /* uint8_t RoleAP :1; */ - /* uint8_t RoleStation :1; */ - /* The filter is activated only in Promiscuous mode */ - /* uint8_t PromiscuousMode :1; */ - /* uint8_t RoleReserved :5; */ - /* }; */ - /* ! Bit fiels of the Filter role */ - uint8_t IntRepresentation; - -} SlrxFilterTriggerRoles_t; - -/*! \typedef SlrxFilterTriggerConnectionStates_t - * Bit field representing the possible values of the When section of the rule - * - */ -#define RX_FILTER_CONNECTION_STATE_STA_CONNECTED (1) -#define RX_FILTER_CONNECTION_STATE_STA_NOT_CONNECTED (2) -#define RX_FILTER_CONNECTION_STATE_STA_HAS_IP (4) -#define RX_FILTER_CONNECTION_STATE_STA_HAS_NO_IP (8) - -typedef union SlrxFilterTriggerConnectionStates_t { - /* struct */ - /* { */ - /* uint8_t RoleStationWiFiConnected :1; */ - /* uint8_t RoleStationWiFiDisconneted:1; */ - /* uint8_t RoleStationWiFiHasIp:1; */ - /* uint8_t RoleStationWiFiHasNoIp:1; */ - /* uint8_t RoleStationWiFiSocketOpened:1; */ - /* uint8_t RoleStationWiFiSocketclosed:1; */ - /* }; */ - /* */ - /* ! */ - uint8_t IntRepresentation; - -} SlrxFilterTriggerConnectionStates_t; - -/*! \typedef SlrxFilterDBTriggerArg_t - * Provides container for entering the filter 'when' argument. - * The current release support 'When rules' which has no arguments. - * For example : - * When connect to specific AP -- the AP bssid is the argument. - * - */ -typedef uint32_t SlrxFilterDBTriggerArg_t; - - - -/*! \typedef SlrxFilterCounterId_t - * the counter ID we have 4 counters - */ -typedef uint8_t SlrxFilterCounterId_t; -/* Possible values for SlrxFilterCounterId_t */ -#define NO_TRIGGER (0) -#define RX_FILTER_COUNTER1 (1) -#define RX_FILTER_COUNTER2 (2) -#define RX_FILTER_COUNTER3 (3) -#define RX_FILTER_COUNTER4 (4) -#define RX_FILTER_COUNTER5 (5) -#define RX_FILTER_COUNTER6 (6) -#define RX_FILTER_COUNTER7 (7) -#define RX_FILTER_COUNTER8 (8) -#define MAX_RX_FILTER_COUNTER (9) - - - -/*! \typedef SlrxFilterActionArgs_t - * Possible value for filter action args - * - */ - -typedef uint8_t SlrxFilterActionArgs_t; -/* Possible values for SlrxFilterActionArgs_t */ -#define ACTION_ARG_REG_1_4 (0) -/* ! Can be use as counter */ -#define ACTION_ARG_TEMPLATE (1) -/* ! Can be use as counter */ -#define ACTION_ARG_EVENT (2) - -/* ! GPIO number */ -#define ACTION_ARG_GPIO (4) -/*! - * \def SL_RX_FILTER_NUM_OF_BYTES_FOR_ACTIONS_ARGS - * - */ -#define SL_RX_FILTER_NUM_OF_BYTES_FOR_ACTIONS_ARGS (5) - - - - -/*! \typedef SlrxFilterTrigger_t - * The filter trigger, determine when the filter is triggered, - * The filter is triggered in the following condition :\n - * 1. The filter parent is triggered\n - * 2. The requested connection type exists, i.e. wlan_connect\n - * 3. The filter role is the same as the system role\n - * - */ -/* -- 12 byte */ -typedef struct SlrxFilterTrigger_t { - /*! The parent filter ID, this is the way to build filter tree. */ - /* NULL value means tree root. - */ - /* -- 1 byte */ - SlrxFilterID_t ParentFilterID; - /* ! See ::SlrxFilterCounterId_t explanation */ - /* -- 1 byte */ - SlrxFilterCounterId_t Trigger; - /* ! See :: SlrxFilterTriggerConnectionStates_t */ - /* -- 1 byte */ - SlrxFilterTriggerConnectionStates_t TriggerArgConnectionState; - /* ! See ::SlrxFilterTriggerRoles_t */ - /* -- 1 byte */ - SlrxFilterTriggerRoles_t TriggerArgRoleStatus; - /* ! The Trigger arguments are in the same order as the Trigger bit field order. */ - /* -- 4 byte */ - SlrxFilterDBTriggerArg_t TriggerArg; - /** The compare function which will be operate for each bit that is turned on in the ::SlrxFilterTrigger_t.Trigger field, - * for example , in case the second bit in the Trigger function is on the second function in the list will be executed. - * - */ - /* -- 1 byte */ - SlrxTriggerCompareFunction_t TriggerCompareFunction; - - /* ! padding */ - /* -- 3 byte */ - uint8_t Padding[3]; -} SlrxFilterTrigger_t; - -/*! \typedef SlrxFilterActionType_t - * The actions are executed only if the filter is matched,\n - * In case of false match the packet is transfered to the HOST. \n - * The action is composed of bit field structure, - * up to 2 actions can be defined per filter. - * - */ -#define RX_FILTER_ACTION_NULL (0x0) -#define RX_FILTER_ACTION_DROP (0x1) -#define RX_FILTER_ACTION_GPIO (0x2) -#define RX_FILTER_ACTION_ON_REG_INCREASE (0x4) -#define RX_FILTER_ACTION_ON_REG_DECREASE (0x8) -#define RX_FILTER_ACTION_ON_REG_RESET (0x10) -#define RX_FILTER_ACTION_SEND_TEMPLATE (0x20) /* unsupported */ -#define RX_FILTER_ACTION_EVENT_TO_HOST (0x40) /* unsupported */ - -typedef union SlrxFilterActionType_t { - /* struct */ - /* { */ - /* ! No action to execute the packet is dropped,drop is always on leaf. */ - /* ! If not dropped ,The packet is passed to the next filter or in case it is the last filter to the host */ - /* uint8_t ActionDrop : 1; */ - /* ! Not Supported in the current release */ - /* uint8_t ActionGpio : 1; */ - /*! action can increase counter registers. - * 1 = Increase - * 2 = decrease - * 3 = reset - */ - /* uint8_t ActionOnREGIncrease : 1; */ - /* uint8_t ActionOnREGDecrease : 1; */ - /* uint8_t ActionOnREGReset : 1; */ - - /* ! Not Supported in the current release */ - /* uint8_t ActionSendTemplate : 1; */ - /* ! Not Supported in the current release */ - /* uint8_t ActionEventToHost: 1; */ - /* uint8_t padding: 1; */ - /* }; */ - - uint8_t IntRepresentation; - -} SlrxFilterActionType_t; - -/*! \typedef SlrxFilterAction_t - * Several actions can be defined,\n - * The action is executed in case the filter rule is matched. - */ -/* -- 8 byte */ -typedef struct SlrxFilterAction_t { - /* -- 1 byte */ - /* ! Determine which actions are supported */ - SlrxFilterActionType_t ActionType; - /* ! Buffer for the action arguments */ - /** - * <b>location 0</b> - The counter to increase - * In case the action is of type "increase" the arg will contain the counter number, - * The counter number values are as in ::SlrxFilterCounterId_t.\n - * <b>location 1</b> - The template arg.\n - * <b>location 2</b> - The event arg.\n - * - */ - /* -- 5 byte */ - SlrxFilterActionArg_t ActionArg[SL_RX_FILTER_NUM_OF_BYTES_FOR_ACTIONS_ARGS]; - - /* ! Padding */ - /* - 2 Bytes */ - uint8_t Padding[2]; - -} SlrxFilterAction_t; - - -/*! \struct _WlanRxFilterOperationCommandBuff_t - * The structure is used for the interface HOST NWP.\n - * The supported operation : \n - * ::ENABLE_DISABLE_RX_FILTER,\n - * ::REMOVE_RX_FILTER,\n - * - */ -/* 20 bytes */ -typedef struct _WlanRxFilterOperationCommandBuff_t { - /* -- 16 bytes */ - SlrxFilterIdMask_t FilterIdMask; - /* 4 bytes */ - uint8_t Padding[4]; -} _WlanRxFilterOperationCommandBuff_t; - - - -/* -- 56 bytes */ -typedef struct _WlanRxFilterUpdateArgsCommandBuff_t { - /* -- 1 bytes */ - uint8_t FilterId; - - /* -- 1 bytes */ - /* ! the args representation */ - uint8_t BinaryRepresentation; - - /* -- 52 byte */ - SlrxFilterRuleHeaderArgsAndMask_t FilterRuleHeaderArgsAndMask; - - /* -- 2 bytes */ - uint8_t Padding[2]; -} _WlanRxFilterUpdateArgsCommandBuff_t; - - -/*! \typedef _WlanRxFilterRetrieveEnableStatusCommandResponseBuff_t - * The structure is used for the interface HOST NWP.\n - * - */ -/* -- 16 bytes */ -typedef struct _WlanRxFilterRetrieveEnableStatusCommandResponseBuff_t { - - /* ! the filter set bit map */ - /* -- 16 bytes */ - SlrxFilterIdMask_t FilterIdMask; - -} _WlanRxFilterRetrieveEnableStatusCommandResponseBuff_t; - - -/*! \struct _WlanRxFilterPrePreparedFiltersCommandBuff_t - * The function enables to perform operations on pre-prepared filters - * - */ -typedef struct _WlanRxFilterPrePreparedFiltersCommandBuff_t { - /* ! the filter set bit map */ - /* -- 4 bytes */ - SlrxFilterPrePreparedFiltersMask_t FilterPrePreparedFiltersMask; - -} _WlanRxFilterPrePreparedFiltersCommandBuff_t; - - -/*! \typedef sl_protocol_WlanRxFilterPrePreparedFiltersCommandResponseBuff_t - * - */ -/*-- 4 bytes */ -typedef struct _WlanRxFilterPrePreparedFiltersCommandResponseBuff_t { - /* -- 4 bytes */ - /* ! the filter set bit map */ - SlrxFilterPrePreparedFiltersMask_t FilterPrePreparedFiltersMask; - -} _WlanRxFilterPrePreparedFiltersCommandResponseBuff_t; - - - -typedef uint8_t SLrxFilterOperation_t; -#define SL_ENABLE_DISABLE_RX_FILTER (0) -#define SL_REMOVE_RX_FILTER (1) -#define SL_STORE_RX_FILTERS (2) -#define SL_UPDATE_RX_FILTER_ARGS (3) -#define SL_FILTER_RETRIEVE_ENABLE_STATE (4) -#define SL_FILTER_PRE_PREPARED_RETRIEVE_CREATE_REMOVE_STATE (5) -#define SL_FILTER_PRE_PREPARED_SET_CREATE_REMOVE_STATE (6) - - -/* Bit manipulation for 8 bit */ -#define ISBITSET8(x,i) ((x[i>>3] & (0x80>>(i&7)))!=0) /* < Is bit set, 8 bit unsigned numbers = x , location = i */ -#define SETBIT8(x,i) x[i>>3]|=(0x80>>(i&7)); /* < Set bit,8 bit unsigned numbers = x , location = i */ -#define CLEARBIT8(x,i) x[i>>3]&=(0x80>>(i&7))^0xFF; /* < Clear bit,8 bit unsigned numbers = x , location = i */ - -namespace mbed_cc3100 { - -/* ******************************************************************************/ -/* RX filters - Start */ -/* ******************************************************************************/ -/* -- 80 bytes */ -typedef struct _WlanRxFilterAddCommand_t { - /* -- 1 byte */ - SlrxFilterRuleType_t RuleType; - /* -- 1 byte */ - SlrxFilterFlags_t FilterFlags; - /* -- 1 byte */ - SlrxFilterID_t FilterId; - /* -- 1 byte */ - uint8_t Padding; - /* -- 56 byte */ - SlrxFilterRule_t Rule; - /* -- 12 byte ( 3 padding ) */ - SlrxFilterTrigger_t Trigger; - /* -- 8 byte */ - SlrxFilterAction_t Action; -} _WlanRxFilterAddCommand_t; - - - -/* -- 4 bytes */ -typedef struct l_WlanRxFilterAddCommandReponse_t { - /* -- 1 byte */ - SlrxFilterID_t FilterId; - /* -- 1 Byte */ - uint8_t Status; - /* -- 2 byte */ - uint8_t Padding[2]; - -} _WlanRxFilterAddCommandReponse_t; - - - -/* - * \struct _WlanRxFilterSetCommand_t - */ -typedef struct _WlanRxFilterSetCommand_t { - uint16_t InputBufferLength; - /* 1 byte */ - SLrxFilterOperation_t RxFilterOperation; - uint8_t Padding[1]; -} _WlanRxFilterSetCommand_t; - -/** - * \struct _WlanRxFilterSetCommandReponse_t - */ -typedef struct _WlanRxFilterSetCommandReponse_t { - /* 1 byte */ - uint8_t Status; - /* 3 bytes */ - uint8_t Padding[3]; - -} _WlanRxFilterSetCommandReponse_t; - -/** - * \struct _WlanRxFilterGetCommand_t - */ -typedef struct _WlanRxFilterGetCommand_t { - uint16_t OutputBufferLength; - /* 1 byte */ - SLrxFilterOperation_t RxFilterOperation; - uint8_t Padding[1]; -} _WlanRxFilterGetCommand_t; - -/** - * \struct _WlanRxFilterGetCommandReponse_t - */ -typedef struct _WlanRxFilterGetCommandReponse_t { - /* 1 byte */ - uint8_t Status; - /* 1 bytes */ - uint8_t Padding; - /* 2 byte */ - uint16_t OutputBufferLength; - -} _WlanRxFilterGetCommandReponse_t; - - - -/* ******************************************************************************/ -/* RX filters -- End */ -/* ******************************************************************************/ - -class cc3100_driver; - -class cc3100_wlan_rx_filters -{ - -public: - - cc3100_wlan_rx_filters(cc3100_driver &driver); - - ~cc3100_wlan_rx_filters(); - - - /*********************************************************************************************/ - /* Function prototypes */ - /*********************************************************************************************/ - - /*! - - \addtogroup wlan - @{ - - */ - - - /*! - \brief Adds new filter rule to the system - - \param[in] RuleType The rule type - \param[in] FilterFlags Flags which set the type of header rule Args and sets the persistent flag - \param[in] pRule Determine the filter rule logic - \param[in] pTrigger Determine when the rule is triggered also sets rule parent. - \param[in] pAction Sets the action to be executed in case the match functions pass - \param[out] pFilterId The filterId which was created - - \return On success, zero is returned. Otherwise error code is returned - */ -#if _SL_INCLUDE_FUNC(sl_WlanRxFilterAdd) - SlrxFilterID_t 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); - -#endif - - - - - - /*! - \brief Sets parameters to Rx filters - - \param[in] RxFilterOperation - possible operations : - - SL_ENABLE_DISABLE_RX_FILTER - Enables\disables filter in a filter list - - SL_REMOVE_RX_FILTER - Removes filter from memory ( to remove from flash call SL_STORE_RX_FILTERS after this command) - - SL_STORE_RX_FILTERS - Save the filters for persistent - - SL_UPDATE_RX_FILTER_ARGS - Update the arguments of existing filter - - SL_FILTER_PRE_PREPARED_SET_CREATE_REMOVE_STATE - Change the default creation of the pre-prepared filters - - \param[in] pInputBuffer options: - The buffer input is _WlanRxFilterOperationCommandBuff_t: - - SL_ENABLE_DISABLE_RX_FILTER - - SL_REMOVE_RX_FILTER - - SL_STORE_RX_FILTERS - The buffer input is _WlanRxFilterUpdateArgsCommandBuff_t: - - SL_UPDATE_RX_FILTER_ARGS - The buffer input is _WlanRxFilterPrePreparedFiltersCommandBuff_t: - - SL_FILTER_PRE_PREPARED_SET_CREATE_REMOVE_STATE - - \param[in] InputbufferLength The length in byte of the input buffer - - \return On success, zero is returned. Otherwise error code is returned - */ - -#if _SL_INCLUDE_FUNC(sl_WlanRxFilterSet) - int16_t sl_WlanRxFilterSet( const SLrxFilterOperation_t RxFilterOperation, - const uint8_t* const pInputBuffer, - uint16_t InputbufferLength); -#endif - - /*! - \brief Gets parameters of Rx filters - - \param[in] RxFilterOperation - possible operations : - - SL_FILTER_RETRIEVE_ENABLE_STATE - Retrieves the enable disable status - - SL_FILTER_PRE_PREPARED_RETRIEVE_CREATE_REMOVE_STATE - Retrieves the pre-prepared filters creation status - - \param[in] pOutputBuffer - The buffer input is _WlanRxFilterRetrieveEnableStatusCommandResponseBuff_t: - - SL_FILTER_RETRIEVE_ENABLE_STATE - The buffer input is _WlanRxFilterPrePreparedFiltersCommandResponseBuff_t: - - SL_FILTER_PRE_PREPARED_RETRIEVE_CREATE_REMOVE_STATE - - \param[in] OutputbufferLength The length in byte of the output buffer - - \return On success, zero is returned. Otherwise error code is returned - */ - -#if _SL_INCLUDE_FUNC(sl_WlanRxFilterGet) - int16_t sl_WlanRxFilterGet(const SLrxFilterOperation_t RxFilterOperation, - uint8_t* pOutputBuffer, - uint16_t OutputbufferLength); -#endif - -private: - - cc3100_driver &_driver; - - - /*! - - Close the Doxygen group. - @} - - */ -};//class - -}//namespace mbed_cc3100 - -#endif /* RX_FILTERS_PREPROCESSOR_CLI_IF_H_ */ - - -