summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/P2PSvc.c
diff options
context:
space:
mode:
Diffstat (limited to 'network/wlan/WDI/COMMON/P2PSvc.c')
-rw-r--r--network/wlan/WDI/COMMON/P2PSvc.c1493
1 files changed, 0 insertions, 1493 deletions
diff --git a/network/wlan/WDI/COMMON/P2PSvc.c b/network/wlan/WDI/COMMON/P2PSvc.c
deleted file mode 100644
index d3f61a75..00000000
--- a/network/wlan/WDI/COMMON/P2PSvc.c
+++ /dev/null
@@ -1,1493 +0,0 @@
-//
-// Description:
-// Implement P2PSvc interface to other part of the driver.
-//
-// Namespace:
-// Local: p2psvc
-// Exported: P2PSvc
-//
-
-#include "Mp_Precomp.h"
-
-#include "P2PSvc_Internal.h"
-
-#if (P2P_SUPPORT == 1)
-#if (P2PSVC_SUPPORT == 1)
-
-//3 -----------------------------------------------------------------------------
-//3 Local
-//3 -----------------------------------------------------------------------------
-
-//
-// Description:
-// This function frees the P2PSvc info of pAdapter.
-// Everything that is dynamically allocated for the P2PSvc info is freed.
-//
-VOID
-p2psvc_Free_P2PSvcInfo(
- IN PP2P_INFO pP2PInfo
- )
-{
- PP2PSVC_INFO pP2PSvcInfo = NULL;
-
- P2PSVC_CHECK_NULL(pP2PInfo);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- if(NULL == pP2PInfo) break;
-
- pP2PSvcInfo = (PP2PSVC_INFO)pP2PInfo->pP2PSvcInfo;
-
- if(!pP2PSvcInfo->bEnabled) break;
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
- {
- P2PSvc_Free_AdvSvcList(&pP2PSvcInfo->advSvcList, &pP2PSvcInfo->advSvcListCnt, 0);
- P2PSvc_Free_SeekReqList(&pP2PSvcInfo->seekReqList, &pP2PSvcInfo->seekReqListCnt, 0);
- P2PSvc_Free_SearchResultObjList(&pP2PSvcInfo->searchResultList, &pP2PSvcInfo->searchResultListCnt);
- P2PSvc_Free_PDSessionList(&pP2PSvcInfo->pdSessionList, &pP2PSvcInfo->pdSessionListCnt);
-
- pP2PSvcInfo->bEnabled = FALSE;
- }
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- PLATFORM_FREE_RT_SPINLOCK(pP2PSvcInfo->lock);
- }while(FALSE);
-
- if(pP2PSvcInfo)
- {
- PlatformZeroMemory(pP2PSvcInfo, sizeof(P2PSVC_INFO));
- }
-
- RT_TRACE_F(COMP_P2P, DBG_WARNING, ("%-32s: %u\n", "Alloc count", gP2PSvcMemAllocCount));
- RT_TRACE_F(COMP_P2P, DBG_WARNING, ("%-32s: %u\n", "Free count", gP2PSvcMemFreeCount));
-
- gP2PSvcMemAllocCount = 0;
- gP2PSvcMemFreeCount = 0;
-
- P2PSVC_FUNC_OUT(DBG_LOUD, 0);
-
- return;
-}
-
-RT_STATUS
-p2psvc_Set_Enable(
- IN PADAPTER pAdapter,
- IN PVOID infoBuf,
- IN u4Byte inBufLen,
- IN u4Byte outBufLen,
- OUT pu4Byte pBytesWritten,
- OUT pu4Byte pBytesRead,
- OUT pu4Byte pBytesNeeded
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2P_INFO pP2PInfo = GET_P2P_INFO(pAdapter);
- PP2PSVC_INFO pP2PSvcInfo = P2PSVC_GET_INFO(pAdapter);
-
- P2PSVC_CHECK_NULL(pAdapter);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- PP2PSVC_OBJ_LIST pObjList = (PP2PSVC_OBJ_LIST)(((PRT_OBJECT_HEADER)infoBuf)->Value);
- PRT_OBJECT_HEADER pBEnableObj = P2PSvc_GetParam(pObjList, P2PSVC_OBJ_HDR_ID_DATA_BENABLE, 0);
- BOOLEAN bEnable = *(PBOOLEAN)pBEnableObj->Value;
-
- if(bEnable)
- {// To enable
- if(pP2PSvcInfo->bEnabled)
- {// already enabled => free the old and re-init
- p2psvc_Free_P2PSvcInfo(pP2PInfo);
- RT_TRACE_F(COMP_P2P, DBG_WARNING, ("[WARNING] Already enable, the old one will be freed!\n"));
- }
-
- PlatformZeroMemory(pP2PSvcInfo, sizeof(P2PSVC_INFO));
-
- PLATFORM_INIT_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
- {
- pP2PSvcInfo->bEnabled = TRUE;
- RTInitializeListHead(&pP2PSvcInfo->advSvcList);
- RTInitializeListHead(&pP2PSvcInfo->seekReqList);
- RTInitializeListHead(&pP2PSvcInfo->searchResultList);
- RTInitializeListHead(&pP2PSvcInfo->pdSessionList);
-
- pP2PSvcInfo->advSvcListCnt = 0;
- pP2PSvcInfo->seekReqListCnt = 0;
- pP2PSvcInfo->searchResultListCnt = 0;
- pP2PSvcInfo->pdSessionListCnt = 0;
-
- pP2PSvcInfo->connCap = P2PSVC_CONN_CAP_BMP_NONE;
- pP2PSvcInfo->pAdapter = pAdapter;
- }
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
- }
- else
- {// To disable
- if(!pP2PSvcInfo->bEnabled)
- {
- rtStatus = RT_STATUS_INVALID_STATE;
- break;
- }
-
- p2psvc_Free_P2PSvcInfo(pP2PInfo);
- }
- }while(FALSE);
-
- *pBytesRead = 0;
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-RT_STATUS
-p2psvc_Query_Enable(
- IN PADAPTER pAdapter,
- IN PVOID infoBuf,
- IN u4Byte inBufLen,
- IN u4Byte outBufLen,
- OUT pu4Byte pBytesWritten,
- OUT pu4Byte pBytesRead,
- OUT pu4Byte pBytesNeeded
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = P2PSVC_GET_INFO(pAdapter);
- PRT_OBJECT_HEADER pObjHdr = NULL;
-
- P2PSVC_CHECK_NULL(pAdapter);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- *pBytesNeeded = RT_OBJECT_HEADER_SIZE + sizeof(u1Byte);
-
- if(outBufLen < *pBytesNeeded)
- {
- RT_TRACE_F(COMP_P2P, DBG_WARNING, ("[WARNING] Buffer (%d) too short for required (%d)!\n", outBufLen, *pBytesNeeded));
- rtStatus = RT_STATUS_INVALID_LENGTH;
- break;
- }
-
- pObjHdr = (PRT_OBJECT_HEADER)(infoBuf);
-
- RT_ASSIGN_OBJECT_HEADER(
- pObjHdr,
- RT_OB_HDR_TYPE_QUERY,
- P2PSVC_OBJ_HDR_ID_DATA_BENABLE,
- pP2PSvcInfo->curVer,
- sizeof(u1Byte));
-
- *((pu1Byte)(pObjHdr->Value)) = (P2PSVC_ENABLED(pP2PSvcInfo)) ? (1) : (0);
-
- *pBytesWritten = *pBytesNeeded;
-
- }while(FALSE);
-
- *pBytesRead = 0;
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// This table maps the request from upper layer to a specifi handler.
-//
-P2PSVC_REQUEST_ID_MAP lP2PSvcRequestIdMap[] =
-{
- // Set Enable/Disable
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_ENABLE,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- p2psvc_Set_Enable
- },
-
- // Query enabled
- {
- RT_OB_HDR_TYPE_QUERY,
- P2PSVC_OBJ_HDR_ID_ACT_ENABLE,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- p2psvc_Query_Enable
- },
-
- // Set seek
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_SEEK,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_Seek
- },
-
- // Set cancel seek
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_CANCEL_SEEK,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_CancelSeek
- },
-
- // Set advertise
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_ADVERTISE,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_AdvSvc
- },
-
- // Set cancel advertise
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_CANCEL_ADVERTISE,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_CancelAdvSvc
- },
-
- // Set svc status
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_SVC_STATUS,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_SvcStatus
- },
-
- // PD Req data
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_PD_REQ,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_PDReq
- },
-
- // Conn cap
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_CONN_CAP,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_ConnCap
- },
-
- // Follow on PD req
- {
- RT_OB_HDR_TYPE_SET,
- P2PSVC_OBJ_HDR_ID_ACT_FOPD_REQ,
- P2PSVC_MIN_SUPPORT_VER,
- P2PSVC_MAX_SUPPORT_VER,
- P2PSvc_Set_RspdorFOPDReq
- },
-
- // ===== Insert new map above this line ===== //
- {
- RT_OB_HDR_TYPE_UNKNOWN,
- P2PSVC_OBJ_HDR_ID_UNKNOWN,
- P2PSVC_OBJECT_VERSION_INVLAID,
- P2PSVC_OBJECT_VERSION_INVLAID,
- NULL
- }
-};
-
-
-//3 -----------------------------------------------------------------------------
-//3 Exported
-//3 -----------------------------------------------------------------------------
-
-BOOLEAN
-P2PSvc_Enabled(
- IN PVOID pvP2PSvcInfo
- )
-{
- return P2PSVC_ENABLED((PP2PSVC_INFO)pvP2PSvcInfo);
-}
-
-VOID
-P2PSvc_Dump(
- IN PADAPTER pAdapter
- )
-{
- PP2PSVC_INFO pP2PSvcInfo = P2PSVC_GET_INFO(pAdapter);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return;
-
- RT_TRACE(COMP_P2P, DBG_LOUD, ("\n"));
- RT_TRACE(COMP_P2P, DBG_LOUD, (", nAdvSvc: %u", pP2PSvcInfo->advSvcListCnt));
- RT_TRACE(COMP_P2P, DBG_LOUD, (", nSeekReq: %u", pP2PSvcInfo->seekReqListCnt));
- RT_TRACE(COMP_P2P, DBG_LOUD, (", nSearchResult: %u", pP2PSvcInfo->searchResultListCnt));
- RT_TRACE(COMP_P2P, DBG_LOUD, (", nPDSession: %u", pP2PSvcInfo->pdSessionListCnt));
-
- RT_TRACE(COMP_P2P, DBG_LOUD, (", allocCnt: %u", gP2PSvcMemAllocCount));
- RT_TRACE(COMP_P2P, DBG_LOUD, (", freeCnt: %u", gP2PSvcMemFreeCount));
-
- return;
-}
-
-RT_STATUS
-P2PSvc_Request(
- IN PADAPTER pAdapter,
- IN PVOID infoBuf,
- IN u4Byte inBufLen,
- IN u4Byte outBufLen,
- OUT pu4Byte pBytesWritten,
- OUT pu4Byte pBytesRead,
- OUT pu4Byte pBytesNeeded
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = P2PSVC_GET_INFO(pAdapter);
- P2PSvc_ReqHdlr reqHdlr = NULL;
- PRT_OBJECT_HEADER pObjHdr = NULL;
- u4Byte idx = 0;
- BOOLEAN bMismatchVer = FALSE;
- PP2PSVC_OBJ_LIST pObjList = NULL;
-
- P2PSVC_CHECK_NULL(pAdapter);
- P2PSVC_CHECK_NULL(pBytesWritten);
- P2PSVC_CHECK_NULL(pBytesRead);
- P2PSVC_CHECK_NULL(pBytesNeeded);
-
- *pBytesWritten = 0;
- *pBytesRead = 0;
- *pBytesNeeded = RT_OBJECT_HEADER_SIZE;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- if(outBufLen < *pBytesNeeded)
- {
- RT_TRACE_F(COMP_P2P | COMP_OID_SET, DBG_WARNING, ("[WARNING] Buffer (%d) too short for required (%d)!\n", outBufLen, *pBytesNeeded));
- rtStatus = RT_STATUS_BUFFER_TOO_SHORT;
- break;
- }
-
- RT_PRINT_DATA(COMP_P2P, DBG_TRACE, "P2PSvc_Request:", infoBuf, inBufLen);
-
- pObjHdr = (PRT_OBJECT_HEADER)infoBuf;
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_ValidateReqInfo(infoBuf, inBufLen, pBytesNeeded)))
- {
- break;
- }
-
- if(RT_OB_HDR_TYPE_SET == pObjHdr->Type)
- {
- // The ObjList is right after an obj header.
- // The obj header is used for oid.
- pObjList = (PP2PSVC_OBJ_LIST)(((PRT_OBJECT_HEADER)infoBuf)->Value);
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_ValidateActionParam(pObjHdr->Id, pObjList)))
- {
- break;
- }
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_ValidateParamContent(pObjList)))
- {
- break;
- }
- }
-
- // Check if P2PSvc is enabled if the action is not query/set enable
- if(P2PSVC_OBJ_HDR_ID_ACT_ENABLE != pObjHdr->Id)
- {
- if(!P2PSVC_ENABLED(pP2PSvcInfo))
- {
- rtStatus = RT_STATUS_INVALID_STATE;
- break;
- }
- }
-
- for(idx = 0; P2PSVC_OBJ_HDR_ID_UNKNOWN != lP2PSvcRequestIdMap[idx].id; idx++)
- {
- // Check Request is matching
- if(pObjHdr->Type == lP2PSvcRequestIdMap[idx].type && pObjHdr->Id == lP2PSvcRequestIdMap[idx].id)
- {// type and id matched
- // Check Version
- if(pObjHdr->Version >= lP2PSvcRequestIdMap[idx].minVer
- && pObjHdr->Version <= lP2PSvcRequestIdMap[idx].maxVer)
- {
- reqHdlr = lP2PSvcRequestIdMap[idx].reqHdlr;
- RT_TRACE_F(COMP_P2P, DBG_LOUD, ("request type = %d, pObjHdr->Id = 0x%08X\n", pObjHdr->Type, pObjHdr->Id));
- break;
- }
- else
- {
- bMismatchVer = TRUE;
- }
- }
- }
-
- if(reqHdlr)
- { // Execute the request handler
- rtStatus = reqHdlr(pAdapter, infoBuf, inBufLen, outBufLen, pBytesWritten, pBytesRead, pBytesNeeded);
- break;
- }
- else if(bMismatchVer)
- {
- RT_TRACE_F(COMP_P2P | COMP_OID_SET, DBG_WARNING, ("[WARNING] Mismatch version (%d) for req ID (%d)!\n", pObjHdr->Version, pObjHdr->Type));
- rtStatus = RT_STATUS_NOT_SUPPORT;
- break;
- }
- else
- {
- RT_TRACE_F(COMP_P2P | COMP_OID_SET, DBG_WARNING, ("[WARNING] Unknown req ID (%d)!\n", pObjHdr->Type));
- rtStatus = RT_STATUS_NOT_RECOGNIZED;
- break;
- }
- }while(FALSE);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// P2PSvcInfo has the same life time of P2PInfo.
-//
-RT_STATUS
-P2PSvc_AllocP2PSvcInfo(
- IN PP2P_INFO pP2PInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
-
- P2PSVC_CHECK_NULL(pP2PInfo);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- if(RT_STATUS_SUCCESS != (rtStatus = PlatformAllocateMemory(pP2PInfo->pAdapter, &pP2PInfo->pP2PSvcInfo, sizeof(P2PSVC_INFO))))
- {
- break;
- }
-
- PlatformZeroMemory(pP2PInfo->pP2PSvcInfo, sizeof(P2PSVC_INFO));
-
- }while(FALSE);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// P2PSvcInfo has the same life time of P2PInfo.
-//
-RT_STATUS
-P2PSvc_Free_P2PSvcInfo(
- IN PP2P_INFO pP2PInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pP2PInfo->pP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pP2PInfo);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- p2psvc_Free_P2PSvcInfo(pP2PInfo);
-
- PlatformFreeMemory(pP2PSvcInfo, sizeof(P2PSVC_INFO));
-
- }while(FALSE);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//-----------------------------------------------------------------------------
-// Process probe event
-//-----------------------------------------------------------------------------
-
-RT_STATUS
-P2PSvc_OnP2PScanComplete(
- IN PVOID pvP2PSvcInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PRT_LIST_ENTRY pListHead = &pP2PSvcInfo->searchResultList;
- PRT_LIST_ENTRY pEntry = NULL;
-
- for(pEntry = RTGetHeadList(pListHead); pEntry != pListHead; pEntry = RTNextEntryList(pEntry))
- {
- PP2PSVC_SR_LIST_ENTRY pSREntry = (PP2PSVC_SR_LIST_ENTRY)pEntry;
-
- if(pSREntry->bDirty)
- {
- P2PSvc_Indicate(pP2PSvcInfo, P2PSVC_OBJ_LIST_LEN(&pSREntry->srObjList), &pSREntry->srObjList);
- pSREntry->bDirty = FALSE;
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// On receiving dev disc complete, we need to free:
-// - all the seek requests
-// - the search result
-//
-RT_STATUS
-P2PSvc_OnDevDiscComplete(
- IN PVOID pvP2PSvcInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {// To erase all seek reqs (if SD is needed, it's done when probing)
- P2PSvc_Free_SeekReqList(&pP2PSvcInfo->seekReqList, &pP2PSvcInfo->seekReqListCnt, 0);
- P2PSvc_Free_SearchResultObjList(&pP2PSvcInfo->searchResultList, &pP2PSvcInfo->searchResultListCnt);
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// On receiving P2PProbeRsp,
-// -
-//check for every seek req to see if it is done by
-// checking whether it has svc-info-req or svc-name is ended with * (i.e., whether SD is needed).
-// If it is done, indicate search result.
-// If it needs further SD req, indicate search result up when SD req is done.
-//
-RT_STATUS
-P2PSvc_OnProbeRsp(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN POCTET_STRING posP2PAttrs
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
- OCTET_STRING osAdvSvcInfo = {NULL, 0};
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
- P2PSVC_CHECK_NULL(posP2PAttrs);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- // Filter out ProbeRsp w/o dev info and adv svc info (not from a P2PS dev)
- if(!P2PSvc_GetP2PAttr(posP2PAttrs, P2P_ATTR_ADV_SVC_INFO, 4, &osAdvSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_TRACE);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PRT_LIST_ENTRY pEntry = NULL;
- PP2PSVC_SR_LIST_ENTRY pSREntry = NULL;
-
- for(pEntry = RTGetHeadList(&pP2PSvcInfo->seekReqList); pEntry != &pP2PSvcInfo->seekReqList; pEntry = RTNextEntryList(pEntry))
- {
- PP2PSVC_REQ_INFO_ENTRY pSeekInfoEntry = (PP2PSVC_REQ_INFO_ENTRY)pEntry;
- PRT_OBJECT_HEADER pSeekDevAddrObj = NULL;
- PP2PSVC_SR_LIST_ENTRY pSREntryInList = NULL;
- PRT_OBJECT_HEADER pSvcInfoReqObj = NULL;
- PRT_OBJECT_HEADER pSeekSearchIdObj = NULL;
- u1Byte searchId = 0;
- BOOLEAN bDuplicatedEntry = FALSE;
-
- // Address filter
- pSeekDevAddrObj = P2PSvc_GetParam(&pSeekInfoEntry->objList, P2PSVC_OBJ_HDR_ID_DATA_DEV_ADDR, 0);
- if(!MacAddr_isBcst(pSeekDevAddrObj->Value) && !eqMacAddr(pSeekDevAddrObj->Value, devAddr))
- {// searching for specific dev and the probe rsp is not from it => ignore it
- continue;
- }
-
- // Get self search id, this is used as an key to find previous search result
- pSeekSearchIdObj = P2PSvc_GetParam(&pSeekInfoEntry->objList, P2PSVC_OBJ_HDR_ID_DATA_SEARCH_ID, 0);
- searchId = *(pu1Byte)pSeekSearchIdObj->Value;
-
- // If the search result entry has been updated by SD rsp, don't update it again with ProbeRsp
- if(!P2PSvc_ToProcessProbeRsp(pP2PSvcInfo, searchId, devAddr))
- {
- break;
- }
-
- // Make data for indication
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeSearchResultDataFromProbeRsp(pP2PSvcInfo, pSeekInfoEntry, devAddr, posP2PAttrs, osAdvSvcInfo, &pSREntry)))
- {
- break;
- }
-
- P2PSVC_CHECK_NULL(pSREntry);
-
- // Update the search result list
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_UpdateSearchResult(pP2PSvcInfo, searchId, devAddr, pSREntry, &bDuplicatedEntry, &pSREntryInList)))
- {
- P2PSvc_FreeMem(pSREntry, P2PSVC_SR_LIST_LEN(pSREntry));
- break;
- }
-
- pSREntryInList->probeRspRxTime = PlatformGetCurrentTime();
-
- // Check whether to indicate
- if(bDuplicatedEntry)
- {// already have same entry in the list => free this one
- P2PSvc_FreeMem(pSREntry, P2PSVC_SR_LIST_LEN(pSREntry));
- }
- else
- {
- pSREntryInList->bDirty = TRUE;
- }
-
- //4 Check if SD is required
- if(P2PSvc_SeekReqNeedSD(&pSeekInfoEntry->objList, pSREntryInList, &pSvcInfoReqObj))
- {
- //1 Note that SD req is sent for each seek req that requires SD req, each has its own transaction id
- //1 The transaction id is set to the search id so we can distinguish from the SD rsp of different seek req
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_SDReq(pP2PSvcInfo, devAddr, pSeekInfoEntry, pSvcInfoReqObj, *(pu1Byte)pSeekSearchIdObj->Value)))
- {
- break;
- }
-
- pSREntryInList->sdReqTxTime = PlatformGetCurrentTime();
- }
- else if(!P2PSvc_SeekReqIsBcst(&pSeekInfoEntry->objList))
- {// search for specific dev => done here
- PRT_LIST_ENTRY pForeEntry = RTForeEntryList(pEntry);
-
- // Remove the seek entry since it is completed
- RTRemoveEntryListWithCnt(pEntry, &pP2PSvcInfo->seekReqListCnt);
- P2PSvc_FreeMem(pEntry, P2PSVC_REQ_INFO_LIST_LEN(pSeekInfoEntry));
- pEntry = pForeEntry;
- }
- else
- {// search for all dev addr
- continue; // continue searching
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_TRACE, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description
-// Make P2PIE for ProbeRsp. According to addendum v0.1, it shall contain
-// the following attributes:
-// * adv-svc-info (id: 23)
-//
-// If it is too big to fit into a single P2PIE, it will be splited into
-// several.
-//
-RT_STATUS
-P2PSvc_MakeProbeRspIE(
- IN PVOID pvP2PSvcInfo,
- IN POCTET_STRING posP2PAttrs,
- OUT FRAME_BUF *pBuf,
- OUT PBOOLEAN pbToSendProbeRsp
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = NULL;
- PP2P_INFO pP2PInfo = NULL;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(posP2PAttrs);
- P2PSVC_CHECK_NULL(pBuf);
- P2PSVC_CHECK_NULL(pbToSendProbeRsp);
-
- pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
- pP2PInfo = (PP2P_INFO)(CONTAINING_RECORD(pP2PSvcInfo, P2P_INFO, pP2PSvcInfo));
-
- *pbToSendProbeRsp = TRUE; // to send probe rsp by default
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- do
- {
- OCTET_STRING osSvcNameHash = {NULL, 0};
-
- if(NULL == posP2PAttrs)
- {// no P2P attr, just ignore
- rtStatus = RT_STATUS_SUCCESS;
- break;
- }
-
- if(!P2PSvc_GetP2PAttr(posP2PAttrs, P2P_ATTR_SVC_HASH, 6, &osSvcNameHash))
- {// no svc-nams-hash, just return success to make respond with a normal P2P ProbeRsp
- if(P2P_CLIENT == pP2PInfo->Role)
- {// if acting as P2P Client, only respond to Probe when it is a WFDS Probe
- *pbToSendProbeRsp = FALSE;
- }
- break;
- }
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeAdvSvcInfo(pP2PSvcInfo, &osSvcNameHash, pBuf)))
- {
- *pbToSendProbeRsp = FALSE; // peer is probing a svc we don't have => not to respond
- break;
- }
- }while(FALSE);
-
- return rtStatus;
-}
-
-RT_STATUS
-P2PSvc_MakeProbeReqIE(
- IN PVOID pvP2PSvcInfo,
- OUT FRAME_BUF *pBuf
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(pBuf);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- do
- {
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeSvcNameHash(pP2PSvcInfo, pBuf)))
- {
- break;
- }
-
- }while(FALSE);
-
- return rtStatus;
-}
-
-//-----------------------------------------------------------------------------
-// Process SD event
-//-----------------------------------------------------------------------------
-
-//
-// Description:
-// Handle SD req for P2P Services.
-// The ANQP query data field of the SD req shall contain:
-// svc-name-len(1), svc-name(n), svc-info-req-len(1), svc-info-req(n)
-// - Do exact svc-name matching if the query svc-name does not contain *
-// otherwise match substring.
-// - Add svc-info if svc-info-req len is not 0
-// The ANQP query rsp data is constructed
-//
-RT_STATUS
-P2PSvc_OnSDReq(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN u1Byte dlgToken,
- IN u1Byte SDReqRecvdSize,
- IN PVOID pvSDReqRecvd,
- OUT PBOOLEAN pbToSendSDRsp
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
- PP2P_SERVICE_REQ_TLV pSvcReqTlv = (PP2P_SERVICE_REQ_TLV)pvSDReqRecvd;
- pu1Byte pBuf = NULL;
- FRAME_BUF fbuf;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
- P2PSVC_CHECK_NULL(pvSDReqRecvd);
- P2PSVC_CHECK_NULL(pbToSendSDRsp);
-
- *pbToSendSDRsp = TRUE;
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_INVALID_STATE;
- if(P2P_SD_PROTOCOL_P2PSVC != pSvcReqTlv->ServiceDesc.ServiceType) return RT_STATUS_INVALID_DATA;
-
- P2PSVC_FUNC_IN(DBG_TRACE);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- u1Byte svcNameLen = 0;
- pu1Byte svcNameBuf = NULL;
- u1Byte svcInfoReqLen = 0;
- pu1Byte svcInfoReqBuf = NULL;
-
- u1Byte nAddedAdvSvc = 0;
-
- PRT_LIST_ENTRY pEntry = NULL;
-
- // Get info from the SD req
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_ParseAnqpQueryReq(pSvcReqTlv, &svcNameLen, &svcNameBuf, &svcInfoReqLen, &svcInfoReqBuf)))
- {
- break;
- }
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_AllocMem(pP2PSvcInfo->pAdapter, &pBuf, P2P_MAX_SERVICE_DESCRIPTOR_BUFFER_LEN)))
- {
- RT_TRACE_F(COMP_P2P, DBG_WARNING, ("[WARNING] Failed to allocate memory for pSvcInfoDescBuf\n"));
- break;
- }
-
- FrameBuf_Init(P2P_MAX_SERVICE_DESCRIPTOR_BUFFER_LEN, 0, pBuf, &fbuf);
-
- // For each advertised svc, check if svc-name matches
- for(pEntry = RTGetHeadList(&pP2PSvcInfo->advSvcList); pEntry != &pP2PSvcInfo->advSvcList; pEntry = RTNextEntryList(pEntry))
- {
- PP2PSVC_REQ_INFO_ENTRY pAdvInfoEntry = (PP2PSVC_REQ_INFO_ENTRY)pEntry;
-
- // Match svc-name
- if(!P2PSvc_SDMatchSvcName(pAdvInfoEntry, svcNameLen, svcNameBuf)) continue;
-
- // Attach svc info desc to
- P2PSvc_MakeSvcInfoDesc(pP2PSvcInfo, pAdvInfoEntry, svcInfoReqLen, svcInfoReqBuf, &fbuf);
-
- nAddedAdvSvc++;
- }
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_SDRsp(pP2PSvcInfo, devAddr, dlgToken, pSvcReqTlv->TransactionID, nAddedAdvSvc, &fbuf)))
- {
- break;
- }
-
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- if(RT_STATUS_SUCCESS == rtStatus)
- {// SD rsp has been sent in P2PSvc_SDRsp()
- *pbToSendSDRsp = FALSE;
- }
-
- if(pBuf)
- {
- P2PSvc_FreeMem(pBuf, P2P_MAX_SERVICE_DESCRIPTOR_BUFFER_LEN);
- }
-
- P2PSVC_FUNC_OUT(DBG_TRACE, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// Handle SD rsp with P2PSvc protocol type.
-//
-//
-RT_STATUS
-P2PSvc_OnSDRsp(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN u1Byte transactionId,
- IN PVOID pvSvcRspTlv,
- OUT PBOOLEAN pbNeedFurtherProcess
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
- PP2P_SERVICE_RSP_TLV pSvcRspTlv = (PP2P_SERVICE_RSP_TLV)pvSvcRspTlv;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
- P2PSVC_CHECK_NULL(pvSvcRspTlv);
-
- *pbNeedFurtherProcess = TRUE;
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_INVALID_STATE;
-
- // If P2PSvc is enabled, there shall be no further process of this SD rsp,
- // otherwise P2P state will be changed incorrectly in P2P_OnSDRsp()
- *pbNeedFurtherProcess = FALSE;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PRT_LIST_ENTRY pEntry = NULL;
-
- for(pEntry = RTGetHeadList(&pP2PSvcInfo->seekReqList); pEntry != &pP2PSvcInfo->seekReqList; pEntry = RTNextEntryList(pEntry))
- {
- PP2PSVC_REQ_INFO_ENTRY pSeekInfoEntry = (PP2PSVC_REQ_INFO_ENTRY)pEntry;
- PRT_OBJECT_HEADER pSeekSearchIdObj = NULL;
- u1Byte searchId = 0;
- BOOLEAN bDuplicatedEntry = FALSE;
-
- PP2PSVC_SR_LIST_ENTRY pSREntry = NULL;
- PP2PSVC_SR_LIST_ENTRY pSREntryInList = NULL;
-
- // Match transaction id, this SD rsp may be the one for other seek req
- pSeekSearchIdObj = P2PSvc_GetParam(&pSeekInfoEntry->objList, P2PSVC_OBJ_HDR_ID_DATA_SEARCH_ID, 0);
- searchId = *(pu1Byte)pSeekSearchIdObj->Value;
- if(transactionId != searchId)
- {
- continue;
- }
-
- if(!P2PSvc_ToProcessSDRsp(pP2PSvcInfo, searchId, devAddr))
- {
- break;
- }
-
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeSearchResultDataFromSDRsp(pP2PSvcInfo, searchId, devAddr, pSvcRspTlv, &pSREntry)))
- {
- break;
- }
-
- // Update search result
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_UpdateSearchResult(pP2PSvcInfo, searchId, devAddr, pSREntry, &bDuplicatedEntry, &pSREntryInList)))
- {
- break;
- }
-
- pSREntryInList->sdRspRxTime = PlatformGetCurrentTime();
-
- // Check if indicat is needed
- if(bDuplicatedEntry)
- {// already have same entry in the list => free this one
- P2PSvc_FreeMem(pSREntry, P2PSVC_SR_LIST_LEN(pSREntry));
- }
- else
- {
- pSREntryInList->bDirty = TRUE;
- }
-
- // Check if the seek is completed
- if(!P2PSvc_SeekReqIsBcst(&pSeekInfoEntry->objList))
- {// search for specific dev => done here
- PRT_LIST_ENTRY pForeEntry = RTForeEntryList(pEntry);
- RTRemoveEntryListWithCnt(pEntry, &pP2PSvcInfo->seekReqListCnt);
- P2PSvc_FreeMem(pEntry, P2PSVC_REQ_INFO_LIST_LEN(pSeekInfoEntry));
- pEntry = pForeEntry;
- }
- else
- {// search for all dev addr
- continue; // continue searching
- }
-
- }
-
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- if(RT_STATUS_SUCCESS == rtStatus)
- {
- *pbNeedFurtherProcess = FALSE;
- }
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//-----------------------------------------------------------------------------
-// Process PD event
-//-----------------------------------------------------------------------------
-
-//
-// Description:
-// Process PD req complete event.
-//
-RT_STATUS
-P2PSvc_OnPDRsp(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN u2Byte reqConfigMethod,
- IN u2Byte rspConfigMethod,
- IN POCTET_STRING posP2PAttrs
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
- P2PSVC_CHECK_NULL(posP2PAttrs);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
-
- if(P2PSvc_IsLegacyPD(posP2PAttrs))
- {
- rtStatus = RT_STATUS_SUCCESS;
- break;
- }
-
- if(!P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- rtStatus = RT_STATUS_INVALID_STATE;
- break;
- }
-
- if(pPDEntry->bInitor)
- {// initor, check PD rsp status, if 1, expect follow on PD req from peer
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_InitorOnPDRsp(pP2PSvcInfo, devAddr, pPDEntry, reqConfigMethod, rspConfigMethod, posP2PAttrs)))
- {
- break;
- }
- }
- else
- {// rspdor, this is a follow on PD rsp
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_RspdorOnFOPDRsp(pP2PSvcInfo, devAddr, pPDEntry, reqConfigMethod, rspConfigMethod, posP2PAttrs)))
- {
- break;
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// This function handles PD req.
-// The P2P module is expected NOT to send PD rsp if this function returns error.
-//
-RT_STATUS
-P2PSvc_OnPDReq(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN u2Byte configMethod,
- IN POCTET_STRING posP2PAttrs,
- OUT PBOOLEAN pbToSendPDRsp
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
- P2PSVC_CHECK_NULL(posP2PAttrs);
- P2PSVC_CHECK_NULL(pbToSendPDRsp);
-
- *pbToSendPDRsp = TRUE;
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
-
- if(P2PSvc_IsLegacyPD(posP2PAttrs))
- {
- rtStatus = RT_STATUS_SUCCESS;
- *pbToSendPDRsp = TRUE;
- break;
- }
-
- if(P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- if(pPDEntry->bInitor)
- {// initor, this shall be a follow on PD req
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_InitorOnFOPDReq(pP2PSvcInfo, devAddr, configMethod, pPDEntry, posP2PAttrs)))
- {
- break;
- }
- }
- else
- {// rspdor, currently involved in another session
- // Will attach status attr with code 2 when constructing PD rsp
- }
- }
- else
- {// no session, we are the rspdor, create a PD session
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_AddPDRspdorData(pP2PSvcInfo, devAddr, configMethod, posP2PAttrs)))
- {
- break;
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- if(RT_STATUS_SUCCESS != rtStatus)
- {
- *pbToSendPDRsp = FALSE;
- }
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-
-
-RT_STATUS
-P2PSvc_OnPDRspSent(
- IN PVOID pvP2PSvcInfo,
- IN BOOLEAN bSendOk
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
-
- if(!P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- break;
- }
-
- if(bSendOk)
- {
- if(pPDEntry->bInitor)
- {// initor, FOPD rsp sent
- P2PSvc_PDSessionSucceeded(pP2PSvcInfo, pPDEntry);
- }
- else
- {// rspdor, PD rsp sent
- if(!pPDEntry->bDeferred)
- {
- P2PSvc_PDSessionSucceeded(pP2PSvcInfo, pPDEntry);
- }
- }
- }
-
- break;
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-RT_STATUS
-P2PSvc_MakePDReqIE(
- IN PVOID pvP2PSvcInfo,
- OUT FRAME_BUF *pBuf
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(pBuf);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
-
- if(!P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- break;
- }
-
- if(pPDEntry->bInitor)
- {// make PD req IE
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeInitorPDReqIE(pP2PSvcInfo, pPDEntry, pBuf)))
- {
- break;
- }
- }
- else
- {// make follow on PD req IE
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeRspdorFOPDReqIE(pP2PSvcInfo, pPDEntry, pBuf)))
- {
- break;
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-
-}
-
-RT_STATUS
-P2PSvc_MakePDRspIE(
- IN PVOID pvP2PSvcInfo,
- IN POCTET_STRING posP2PAttrs,
- OUT FRAME_BUF *pBuf
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(pBuf);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_CHECK_NULL(posP2PAttrs);
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
-
- if(!P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- break;
- }
-
- if(pPDEntry->bInitor)
- {// initor, recv follow on PD req, make follow on PD rsp IE
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeInitorFOPDRspIE(pP2PSvcInfo, pPDEntry, posP2PAttrs, pBuf)))
- {
- break;
- }
- }
- else
- {// rspdor, attach status attr with code 1 if !auto-accept
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_MakeRspdorPDRspIE(pP2PSvcInfo, pPDEntry, posP2PAttrs, pBuf)))
- {
- break;
- }
- }
-
- // If the session is completed, it will be freed when PD rsp sent.
-
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-//
-// Description:
-// This function handles the case when the PD initor fails to send PD req.
-//
-//
-RT_STATUS
-P2PSvc_OnSendPDReqFailure(
- IN PVOID pvP2PSvcInfo,
- IN pu1Byte devAddr,
- IN u1Byte p2pStatus
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
- P2PSVC_CHECK_NULL(devAddr);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_INVALID_STATE;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- PP2PSVC_PD_ENTRY pPDEntry = NULL;
- OCTET_STRING osStatus = {NULL, 0};
- P2P_STATUS_CODE pdStatus = 0;
-
- if(!P2PSvc_PDSessionInProgress(pP2PSvcInfo, &pPDEntry))
- {
- rtStatus = RT_STATUS_INVALID_STATE;
- break;
- }
-
- if(pPDEntry->bInitor)
- {// failed to send PD req
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_InitorOnSendPDReqFailure(pP2PSvcInfo, pPDEntry, p2pStatus)))
- {
- break;
- }
- }
- else
- {// failed to send FOPD req
- if(RT_STATUS_SUCCESS != (rtStatus = P2PSvc_RspdorOnSendFOPDReqFailure(pP2PSvcInfo, pPDEntry, p2pStatus)))
- {
- break;
- }
- }
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-
-}
-
-RT_STATUS
-P2PSvc_OnWatchdog(
- IN PVOID pvP2PSvcInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- // Timeout out dated PD session
- P2PSvc_PDSessionAgeFunc(pP2PSvcInfo);
-
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-RT_STATUS
-P2PSvc_OnDisconnect(
- IN PVOID pvP2PSvcInfo
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PP2PSVC_INFO pP2PSvcInfo = (PP2PSVC_INFO)pvP2PSvcInfo;
-
- P2PSVC_CHECK_NULL(pvP2PSvcInfo);
-
- if(!P2PSVC_ENABLED(pP2PSvcInfo)) return RT_STATUS_SUCCESS;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- PLATFORM_ACQUIRE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- do
- {
- P2PSvc_Free_PDSessionList(&pP2PSvcInfo->pdSessionList, &pP2PSvcInfo->pdSessionListCnt);
- }while(FALSE);
-
- PLATFORM_RELEASE_RT_SPINLOCK(pP2PSvcInfo->lock);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-
-//-----------------------------------------------------------------------------
-// Override default P2P behavior
-//-----------------------------------------------------------------------------
-
-RT_STATUS
-P2PSvc_DetermineGOSSID(
- IN PADAPTER pAdapter,
- OUT pu1Byte ssidBuf,
- OUT pu1Byte pSsidLen
- )
-{
- RT_STATUS rtStatus = RT_STATUS_SUCCESS;
- PADAPTER pDefAdapter = GetDefaultAdapter(pAdapter);
- PP2PSVC_INFO pDefP2PSVcInfo = P2PSVC_GET_INFO(pDefAdapter);
-
- P2PSVC_CHECK_NULL(pAdapter);
- P2PSVC_CHECK_NULL(ssidBuf);
- P2PSVC_CHECK_NULL(pSsidLen);
-
- *pSsidLen = 0;
-
- if(!P2PSVC_ENABLED(pDefP2PSVcInfo)) return RT_STATUS_INVALID_STATE;
-
- P2PSVC_FUNC_IN(DBG_LOUD);
-
- do
- {
- P2PSvc_DeterminePDSessionGOSsid(pDefP2PSVcInfo, ssidBuf, pSsidLen);
-
- }while(FALSE);
-
- P2PSVC_FUNC_OUT(DBG_LOUD, rtStatus);
-
- return rtStatus;
-}
-
-#endif // #if (P2PSVC_SUPPORT == 1)
-#endif // #if (P2P_SUPPORT == 1)