Esempio n. 1
0
/*==========================================================================

  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*/
Esempio n. 2
0
/*===========================================================================

  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; 

}
Esempio n. 3
0
/*===========================================================================

  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 */
Esempio n. 4
0
VOS_STATUS
WLANBAP_InitLinkSupervision
( 
  ptBtampHandle     btampHandle
)
{
    VOS_STATUS               vosStatus = VOS_STATUS_SUCCESS;
    ptBtampContext           pBtampCtx = (ptBtampContext) btampHandle;
    vos_pkt_t                *pLSReqPacket; 
    vos_pkt_t                *pLSRepPacket; 
    v_U16_t                   lsPktln; 

    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;
    }

#if 0    
    /* Initialize Link supervision data structure */
    vos_mem_set(pLsInfo, sizeof(tBtampLS),0);

    /* Allocate memory for Static Tx Data */
    pLsInfo->pTxPktData = vos_mem_malloc(sizeof(tBtampLsPktData)+TX_LS_DATALEN);

    /* Initialize Static data for LS pkt Tx */
    pLsInfo->pTxPktData->BufLen = TX_LS_DATALEN;
    vos_mem_copy (&pLsInfo->pTxPktData->pBuf, LsTxData, pLsInfo->pTxPktData->BufLen);
#endif
    pBtampCtx->lsReqPktPending = VOS_FALSE;
    pBtampCtx->retries = 0;

    vosStatus = WLANBAP_AcquireLSPacket( pBtampCtx, &pLSReqPacket,32, TRUE );
    if( VOS_IS_STATUS_SUCCESS( vosStatus ) )
    {
        pBtampCtx->lsReqPacket = pLSReqPacket;
    }
    else
    {
         VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO,
                       "%s:AcquireLSPacket failed\n",__FUNCTION__);
         pBtampCtx->lsReqPacket = NULL;
         return vosStatus;   
    }

    vosStatus = WLANBAP_AcquireLSPacket( pBtampCtx, &pLSRepPacket,32,FALSE );
    if( VOS_IS_STATUS_SUCCESS( vosStatus ) )
    {
        pBtampCtx->lsRepPacket = pLSRepPacket;
    }
    else
    {
         VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO,
                       "%s:AcquireLSPacket failed\n",__FUNCTION__);
         pBtampCtx->lsRepPacket = NULL;
         return vosStatus;   
    }        

    vosStatus = vos_pkt_get_packet_length(pBtampCtx->lsRepPacket,&lsPktln); 

    if ( VOS_STATUS_SUCCESS != vosStatus ) 
    {
         VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO,
                       "%s:vos_pkt_get_length error",__FUNCTION__);
         return VOS_STATUS_E_FAULT;
    }
    pBtampCtx->lsPktln = lsPktln;

    /* Start Link Supervision Timer if not configured for infinite */
    if (pBtampCtx->bapLinkSupervisionTimerInterval)
    {
        vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx,
                   pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME);
    }
    else
    {
         VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_INFO,
                       "%s:No LS configured for infinite",__FUNCTION__);
    }
   
    return vosStatus;
}