Ejemplo n.º 1
0
/*******************************************************************************
**
** Function         llcp_init
**
** Description      This function is called once at startup to initialize
**                  all the LLCP structures
**
** Returns          void
**
*******************************************************************************/
void llcp_init (void)
{
    UINT32 pool_count;

    memset (&llcp_cb, 0, sizeof (tLLCP_CB));

    llcp_cb.trace_level = LLCP_INITIAL_TRACE_LEVEL;

    LLCP_TRACE_DEBUG0 ("LLCP - llcp_init ()");

    llcp_cb.lcb.local_link_miu = (LLCP_MIU <= LLCP_MAX_MIU ? LLCP_MIU : LLCP_MAX_MIU);
    llcp_cb.lcb.local_opt      = LLCP_OPT_VALUE;
    llcp_cb.lcb.local_wt       = LLCP_WAITING_TIME;
    llcp_cb.lcb.local_lto      = LLCP_LTO_VALUE;

    llcp_cb.lcb.inact_timeout_init   = LLCP_INIT_INACTIVITY_TIMEOUT;
    llcp_cb.lcb.inact_timeout_target = LLCP_TARGET_INACTIVITY_TIMEOUT;
    llcp_cb.lcb.symm_delay           = LLCP_DELAY_RESP_TIME;
    llcp_cb.lcb.data_link_timeout    = LLCP_DATA_LINK_CONNECTION_TOUT;
    llcp_cb.lcb.delay_first_pdu_timeout = LLCP_DELAY_TIME_TO_SEND_FIRST_PDU;

    llcp_cb.lcb.wks  = LLCP_WKS_MASK_LM;

    /* total number of buffers for LLCP */
    pool_count = GKI_poolcount (LLCP_POOL_ID);

    /* number of buffers for receiving data */
    llcp_cb.num_rx_buff = (pool_count * LLCP_RX_BUFF_RATIO) / 100;

    /* rx congestion start/end threshold */
    llcp_cb.overall_rx_congest_start = (UINT8) ((llcp_cb.num_rx_buff * LLCP_RX_CONGEST_START) / 100);
    llcp_cb.overall_rx_congest_end   = (UINT8) ((llcp_cb.num_rx_buff * LLCP_RX_CONGEST_END) / 100);

    /* max number of buffers for receiving data on logical data link */
    llcp_cb.max_num_ll_rx_buff = (UINT8) ((llcp_cb.num_rx_buff * LLCP_LL_RX_BUFF_LIMIT) / 100);

    LLCP_TRACE_DEBUG4 ("num_rx_buff = %d, rx_congest_start = %d, rx_congest_end = %d, max_num_ll_rx_buff = %d",
                        llcp_cb.num_rx_buff, llcp_cb.overall_rx_congest_start,
                        llcp_cb.overall_rx_congest_end, llcp_cb.max_num_ll_rx_buff);

    /* max number of buffers for transmitting data */
    llcp_cb.max_num_tx_buff    = (UINT8) (pool_count - llcp_cb.num_rx_buff);

    /* max number of buffers for transmitting data on logical data link */
    llcp_cb.max_num_ll_tx_buff = (UINT8) ((llcp_cb.max_num_tx_buff * LLCP_LL_TX_BUFF_LIMIT) / 100);

    LLCP_TRACE_DEBUG2 ("max_num_tx_buff = %d, max_num_ll_tx_buff = %d",
                        llcp_cb.max_num_tx_buff, llcp_cb.max_num_ll_tx_buff);

    llcp_cb.ll_tx_uncongest_ntf_start_sap = LLCP_SAP_SDP + 1;

    LLCP_RegisterServer (LLCP_SAP_SDP, LLCP_LINK_TYPE_DATA_LINK_CONNECTION, "urn:nfc:sn:sdp", llcp_sdp_proc_data);
}
Ejemplo n.º 2
0
/*******************************************************************************
**
** Function         llcp_sdp_return_sap
**
** Description      Report TID and SAP to requester
**
**
** Returns          void
**
*******************************************************************************/
static void llcp_sdp_return_sap (UINT8 tid, UINT8 sap)
{
    UINT8 i;

    LLCP_TRACE_DEBUG2 ("llcp_sdp_return_sap (): tid=0x%x, SAP=0x%x", tid, sap);

    for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++)
    {
        if (  (llcp_cb.sdp_cb.transac[i].p_cback)
            &&(llcp_cb.sdp_cb.transac[i].tid == tid)  )
        {
            (*llcp_cb.sdp_cb.transac[i].p_cback) (tid, sap);

            llcp_cb.sdp_cb.transac[i].p_cback = NULL;
        }
    }
}
Ejemplo n.º 3
0
/*******************************************************************************
**
** Function         llcp_util_allocate_data_link
**
** Description      Allocate tLLCP_DLCB for data link connection
**
** Returns          tLLCP_DLCB *
**
******************************************************************************/
tLLCP_DLCB *llcp_util_allocate_data_link (UINT8 reg_sap, UINT8 remote_sap)
{
    tLLCP_DLCB *p_dlcb = NULL;
    int         idx;

    LLCP_TRACE_DEBUG2 ("llcp_util_allocate_data_link (): reg_sap = 0x%x, remote_sap = 0x%x",
                        reg_sap, remote_sap);

    for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++)
    {
        if (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_IDLE)
        {
            p_dlcb = &(llcp_cb.dlcb[idx]);

            memset (p_dlcb, 0, sizeof (tLLCP_DLCB));
            break;
        }
    }

    if (!p_dlcb)
    {
        LLCP_TRACE_ERROR0 ("llcp_util_allocate_data_link (): Out of DLCB");
    }
    else
    {
        p_dlcb->p_app_cb    = llcp_util_get_app_cb (reg_sap);
        p_dlcb->local_sap   = reg_sap;
        p_dlcb->remote_sap  = remote_sap;
        p_dlcb->timer.param = (TIMER_PARAM_TYPE) p_dlcb;

        /* this is for inactivity timer and congestion control. */
        llcp_cb.num_data_link_connection++;

        LLCP_TRACE_DEBUG3 ("llcp_util_allocate_data_link (): local_sap = 0x%x, remote_sap = 0x%x, num_data_link_connection = %d",
                            p_dlcb->local_sap, p_dlcb->remote_sap, llcp_cb.num_data_link_connection);
    }
    return p_dlcb;
}
Ejemplo n.º 4
0
/*******************************************************************************
**
** Function         llcp_sdp_send_sdres
**
** Description      Send Service Discovery Response
**
**
** Returns          LLCP_STATUS
**
*******************************************************************************/
static tLLCP_STATUS llcp_sdp_send_sdres (UINT8 tid, UINT8 sap)
{
    tLLCP_STATUS status;
    UINT16       available_bytes;

    LLCP_TRACE_DEBUG2 ("llcp_sdp_send_sdres (): tid=0x%x, SAP=0x%x", tid, sap);

    /* if there is no pending SNL */
    if (!llcp_cb.sdp_cb.p_snl)
    {
        llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);

        if (llcp_cb.sdp_cb.p_snl)
        {
            llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
            llcp_cb.sdp_cb.p_snl->len    = 0;
        }
    }

    if (llcp_cb.sdp_cb.p_snl)
    {
        available_bytes = GKI_get_buf_size (llcp_cb.sdp_cb.p_snl)
                          - BT_HDR_SIZE - llcp_cb.sdp_cb.p_snl->offset
                          - llcp_cb.sdp_cb.p_snl->len;

        /* if SDRES parameter can be added in SNL */
        if (  (available_bytes >= 2 + LLCP_SDRES_LEN)
            &&(llcp_cb.sdp_cb.p_snl->len + 2 + LLCP_SDRES_LEN <= llcp_cb.lcb.effective_miu)  )
        {
            llcp_sdp_add_sdres (tid, sap);
            status = LLCP_STATUS_SUCCESS;
        }
        else
        {
            /* send pending SNL PDU to LM */
            llcp_sdp_check_send_snl ();

            llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);

            if (llcp_cb.sdp_cb.p_snl)
            {
                llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
                llcp_cb.sdp_cb.p_snl->len    = 0;

                llcp_sdp_add_sdres (tid, sap);

                status = LLCP_STATUS_SUCCESS;
            }
            else
            {
                status = LLCP_STATUS_FAIL;
            }
        }
    }
    else
    {
        status = LLCP_STATUS_FAIL;
    }

    /* if LM is waiting for PDUs from upper layer */
    if (  (status == LLCP_STATUS_SUCCESS)
        &&(llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)  )
    {
        llcp_link_check_send_data ();
    }

    return status;
}