/*=========================================================================== FUNCTION WLANBAP_DeInitLinkSupervision DESCRIPTION This API will be called when Link Supervision module is to be stopped after disconnected at BAP PARAMETERS btampHandle: The BT-AMP PAL handle returned in WLANBAP_GetNewHndl. RETURN VALUE The result code associated with performing the operation VOS_STATUS_E_INVAL: Input parameters are invalid VOS_STATUS_E_FAULT: BAP handle is NULL VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WLANBAP_DeInitLinkSupervision ( ptBtampHandle btampHandle ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; ptBtampContext pBtampCtx = (ptBtampContext) btampHandle; if ( NULL == pBtampCtx) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid BAP handle value in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "In: %s", __FUNCTION__); vosStatus = WLANBAP_StopLinkSupervisionTimer(pBtampCtx); /*Free the vos packet*/ if ( pBtampCtx->lsRepPacket ) { vosStatus = vos_pkt_return_packet(pBtampCtx->lsRepPacket); pBtampCtx->lsRepPacket = NULL; } if ( pBtampCtx->lsReqPacket ) { vosStatus = vos_pkt_return_packet(pBtampCtx->lsReqPacket); pBtampCtx->lsReqPacket = NULL; } return vosStatus; }
/*========================================================================== FUNCTION WLANBAP_LinkSupervisionTimerHandler DESCRIPTION Callback function registered with vos timer for the LinkSupervision timer DEPENDENCIES PARAMETERS IN userData: pointer can be used to retrive the BT-AMP context RETURN VALUE None SIDE EFFECTS ============================================================================*/ v_VOID_t WLANBAP_LinkSupervisionTimerHandler ( v_PVOID_t userData ) { ptBtampContext pBtampCtx = (ptBtampContext)userData; VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; ptBtampHandle btampHandle = (ptBtampHandle)userData; tWLAN_BAPEvent bapEvent; /* State machine event */ v_U8_t phy_link_handle; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /*----------------------------------------------------------------------- Sanity check -----------------------------------------------------------------------*/ if ( NULL == pBtampCtx ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "WLAN BAP: Fatal error in %s", __func__ ); VOS_ASSERT(0); return; } phy_link_handle = pBtampCtx->phy_link_handle; VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "WLAN BAP:In LinkSupervision Timer handler %s", __func__ ); if(pBtampCtx->dataPktPending == VOS_TRUE) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "%s: Data seen. Do nothing", __func__ ); pBtampCtx->dataPktPending = VOS_FALSE; pBtampCtx->lsReqPktPending = VOS_FALSE; pBtampCtx->retries = 0; vosStatus = WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); //Data is seen. or our previous packet is not yet fetched by TL.Don't do any thing.Just return; return; } else if((pBtampCtx->lsReqPktPending == VOS_TRUE ) && (pBtampCtx->retries == WLANBAP_LINK_SUPERVISION_RETRIES)) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "#########WLAN BAP: LinkSupervision Timed OUT######## %s", __func__ ); /*--------------------------------------------------------------------- Feed this timeout to the BTAMP FSM ---------------------------------------------------------------------*/ /* Fill in the event structure */ /* JEZ110307: Which should this be? */ //bapEvent.event =eWLAN_BAP_HCI_PHYSICAL_LINK_DISCONNECT; bapEvent.event =eWLAN_BAP_MAC_INDICATES_MEDIA_DISCONNECTION; bapEvent.params = NULL; /* Handle event */ vosStatus = btampFsm(pBtampCtx, &bapEvent, (v_U8_t *)&vosStatus); } else { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "%s: Resend the LS packet", __func__ ); /* If we have transmit pkt pending and the time out occurred,resend the ls packet */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); pBtampCtx->pPacket = pBtampCtx->lsReqPacket; vosStatus = WLANBAP_TxLinkSupervision( btampHandle, phy_link_handle, pBtampCtx->pPacket , WLANTL_BT_AMP_TYPE_LS_REQ); } }/*WLANBAP_LinkSupervisionTimerHandler*/
/*=========================================================================== FUNCTION WLANBAP_TxLinkSupervision DESCRIPTION This API will be called to process Link Supervision Request received PARAMETERS btampHandle: The BT-AMP PAL handle returned in WLANBAP_GetNewHndl. pucAC: Pointer to return the access category vosDataBuff: The data buffer containing the 802.3 frame to be translated to BT HCI Data Packet RETURN VALUE The result code associated with performing the operation VOS_STATUS_E_INVAL: Input parameters are invalid VOS_STATUS_E_FAULT: BAP handle is NULL VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WLANBAP_TxLinkSupervision ( ptBtampHandle btampHandle, v_U8_t phy_link_handle, /* Used by BAP to indentify the WLAN assoc. (StaId) */ vos_pkt_t *pPacket, v_U16_t protoType ) { ptBtampContext pBtampCtx = (ptBtampContext)btampHandle; VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; v_PVOID_t pvosGCtx; v_U8_t ucSTAId; /* The StaId (used by TL, PE, and HAL) */ v_PVOID_t pHddHdl; /* Handle to return BSL context in */ WLANTL_MetaInfoType metaInfo; VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "In : %s protoType=%x", __FUNCTION__,protoType); // Retrieve the VOSS context pvosGCtx = pBtampCtx->pvosGCtx; /* Lookup the StaId using the phy_link_handle and the BAP context */ vosStatus = WLANBAP_GetStaIdFromLinkCtx ( btampHandle, /* btampHandle value in */ phy_link_handle, /* phy_link_handle value in */ &ucSTAId, /* The StaId (used by TL, PE, and HAL) */ &pHddHdl); /* Handle to return BSL context */ if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Unable to retrieve STA Id from BAP context and phy_link_handle in WLANBAP_TxLinKSupervisionReq"); return VOS_STATUS_E_FAULT; } vos_mem_zero( &metaInfo, sizeof( WLANTL_MetaInfoType ) ); metaInfo.ucTID = 0x00 ; metaInfo.ucUP = 0x00; metaInfo.ucIsEapol = VOS_FALSE;//Notify TL that this is NOT an EAPOL frame metaInfo.ucDisableFrmXtl = VOS_FALSE; metaInfo.ucType = 0x00; pBtampCtx->metaInfo = metaInfo; vosStatus = WLANTL_TxBAPFrm( pvosGCtx, pPacket, &metaInfo, WLANBAP_TxLinkSupervisionCB ); if( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Tx: Packet rejected by TL in WLANBAP_TxLinkSupervisionReq"); return vosStatus; } if(protoType == WLANTL_BT_AMP_TYPE_LS_REQ) { pBtampCtx->lsReqPktPending = TRUE; pBtampCtx->retries++; } if (pBtampCtx->bapLinkSupervisionTimerInterval) { /* Restart the LS timer */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); } if( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "WLANBAP_TxLinkSupervisionReq failed to Start LinkSupervision Timer\n" ); return vosStatus; } return vosStatus; } /* WLANBAP_RxLinkSupervisionReq */
/*=========================================================================== FUNCTION WLANBAP_RxProcLsPkt DESCRIPTION This API will be called when Link Supervision frames are received at BAP PARAMETERS btampHandle: The BT-AMP PAL handle returned in WLANBAP_GetNewHndl. pucAC: Pointer to return the access category vosDataBuff: The data buffer containing the 802.3 frame to be translated to BT HCI Data Packet RETURN VALUE The result code associated with performing the operation VOS_STATUS_E_INVAL: Input parameters are invalid VOS_STATUS_E_FAULT: BAP handle is NULL VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WLANBAP_RxProcLsPkt ( ptBtampHandle btampHandle, v_U8_t phy_link_handle, /* Used by BAP to indentify the WLAN assoc. (StaId) */ v_U16_t RxProtoType, /* Protocol Type from the frame received */ vos_pkt_t *vosRxLsBuff ) { VOS_STATUS vosStatus; ptBtampContext pBtampCtx = (ptBtampContext) btampHandle; WLANBAP_8023HeaderType w8023Header; v_SIZE_t HeaderLen = sizeof(w8023Header); /*------------------------------------------------------------------------ Sanity check params ------------------------------------------------------------------------*/ if ( NULL == pBtampCtx) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid BAP handle value in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "In %s Received RxProtoType=%x", __FUNCTION__,RxProtoType); vos_pkt_extract_data(vosRxLsBuff,0,(v_VOID_t*)&w8023Header,&HeaderLen); if ( !(vos_mem_compare( w8023Header.vDA, pBtampCtx->self_mac_addr, VOS_MAC_ADDR_SIZE) && vos_mem_compare( w8023Header.vSA, pBtampCtx->peer_mac_addr, VOS_MAC_ADDR_SIZE))) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "MAC address mismatch in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } /*Free the vos packet*/ vosStatus = vos_pkt_return_packet( vosRxLsBuff ); if ( VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Failed to free VOS packet in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } /* Reset Link Supervision timer */ if (RxProtoType == WLANTL_BT_AMP_TYPE_LS_REP) { pBtampCtx->lsReqPktPending = FALSE; pBtampCtx->retries = 0; if (pBtampCtx->bapLinkSupervisionTimerInterval) { /* Restart the LS timer */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); } } else if(RxProtoType == WLANTL_BT_AMP_TYPE_LS_REQ) { if (pBtampCtx->bapLinkSupervisionTimerInterval) { /* Restart the LS timer */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); } pBtampCtx->pPacket = pBtampCtx->lsRepPacket; // Handle LS rep frame vosStatus = WLANBAP_TxLinkSupervision( btampHandle, phy_link_handle, pBtampCtx->pPacket, WLANTL_BT_AMP_TYPE_LS_REP); } return vosStatus; }