Ejemplo 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*/
Ejemplo 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; 

}